Soru Dize bir değer türü veya referans tipi mi?


Dize bir değer türü veya referans tipi mi?

Bunun için "iyi" bir açıklama bulamıyorum ...


46
2017-07-01 13:30


Menşei


ilgili stackoverflow.com/questions/636932/... - nawfal
Kabul edilen cevap "kanıtlar" bir referans türüdür. Diğer referans türlerinden farklı olarak NullReferenceException aşağıdaki değerlendirildiğinde: string s0 = null; Console.WriteLine(s0); string result = String.Concat(s0, "aaa"); Belki de sadece kabul edilen kategorilere düzgün uymuyor. - H2ONaCl
@ H2ONaCl öyle beklenmiyor bu durumlarda bu istisnayı atmak; metodlar could atmayı seç ArgumentNullException, fakat her iki yöntem açıkça bunu yapmayı seçmediklerini söyleyin; Console.WriteLine diyor ki: "Değer boşsa, standart çıktı akışına yalnızca satır sonlandırıcı yazılır."; String.Concat "Boş bir dize herhangi bir boş argüman yerine kullanılır." Ve bu mükemmel bir şey. Genelde bekleyeceğimiz tek zaman NullReferenceException gibi şeyler s0.Length, hangi: gerçekten, atar - Marc Gravell♦


Cevaplar:


Console.WriteLine(typeof(string).IsClass); // true

Bu bir referans tipi.

Değer türü, yığın için bilinen bir boyuta gereksinim duyduğu için değer türü olamaz. Referans tipi olarak, referans dize boyutu olmasa bile önceden bilinir.

O davranacağını değişecek bir değer türü beklediğiniz gibi, değişmez olduğu için; yani oluşturulduğunda * değişmez. Fakat başka birçok değişmez referans tipi var. Örneğin, temsilci örnekleri.

* = içeride hariç StringBuilderama bunu yaparken asla göremezsin ...


89
2017-07-01 13:34



+1. Küçük harfli dizgeyi gerçekten sevmiyorum. Bir değer türüne benziyor, referans tipi gibi davranıyor. - ojrac
Dava ile ne ilgisi var? Bu sadece bir takma addır ... nesne örneğin referans tipidir. - Marc Gravell♦
StringBuilder, dahili bir dize değil, bir char [] kullanır.
@Phong tekrar kontrol edin. Son baktığımda dürüst bir şekilde string- daha sonra güvensiz mutasyonlar yapar (yeni bir dizge tahsis eder ve gerektiğinde kopyalama yapar). Kontrol ettin mi? Ve eğer öyleyse: ne. Net sürümü? - Marc Gravell♦
@ SMI bir varsayılan değeri string olduğu null, çünkü string bir referans türüdür. Varsayılan bir değer olduğunu söylemek yanlıştır. string olduğu ""çünkü: değil. - Marc Gravell♦


Dize, değişmez bir referans türüdür.

Blog yayınına bakın Kaçırılmamış tipler: faydalarını anlayın ve bunları kullanın değişmezlik üzerinde.


17
2017-07-01 13:32





Dize bir referans türüdür.


13
2017-07-01 13:31





Temel "açıklama", şey için değişken "bildirdiğinizde" ayrılan bellek konumunda "ne" olduğunu temel alır. Bir şeyin gerçek değeri, değişken ismiyle belirtilen bellek konumunda saklanırsa, o zaman bir değer türüdür.

   int x;  // memory allocated to hold Value of x, default value assigned of zero

Eğer otoh, "declare" sırasında tahsis edilen hafıza slotu sadece bazı diğer gerçek değerin (veya değerlerin) kaydedileceği bellek adresi, daha sonra bir referans türüdür.

   MyClass x;  // Memory allocated to hold an address, 
               // default address of null (0) assigned.  
               // NO MEMORY ALLOCATED for x itself 

veya bildirimin başlatmayı içermesi durumunda,

   MyClass x = new MyClass();  
     // Now, Memory slot (call it Addr1) is allocated to hold address of x, 
     // more memory (call it Addr2) is allocated to hold a new MyClass object.
     // New MyClass object created, stored in memory Addr2 (on the Heap)
     // Address of new object (Addr2) is stored in Addr1

Bir dize için, dizede Yığın oluşturulur ve adres değişkeni için ayrılmış bellek yuvasına gider, bu nedenle bir referans türüdür.


11
2017-07-01 14:04





String, bir değer tipi olmanın ara sıra görünmesini sağlayan belirli niteliklere sahip olan değişmez bir referans türüdür.


5
2017-07-01 13:34





Dize tipi sıfır veya daha fazla Unicode karakter dizisini temsil eder. string, .NET Framework'deki String için bir takma addır.

Dize bir başvuru türü olsa da, eşitlik işleçleri (== ve! =), Başvurulan dize nesneleri değerlerini karşılaştırmak için tanımlanır. Bu dize eşitliği için daha sezgisel test yapar. Örneğin:

string a = "hello";
string b = "h";
// Append to contents of 'b'
b += "ello";
Console.WriteLine(a == b);
Console.WriteLine((object)a == (object)b);

Bu, "True" ve sonra "False" görüntüler, çünkü dizelerin içeriği eşdeğerdir, ancak a ve b aynı dize örneğine başvurmaz.

Dizeler değişmezdir - nesne oluşturulduktan sonra bir dize nesnesinin içeriği değiştirilemez, ancak sözdizimi bunu yapabildiğiniz gibi görünür. Örneğin, bu kodu yazdığınızda, derleyici aslında yeni karakter dizisini tutmak için yeni bir dize nesnesi oluşturur ve bu yeni nesne b'ye atanır. "H" dizesi daha sonra çöp toplama için uygundur.

string b = "h";
b += "ello";

4
2018-06-01 12:31





Birçok dilde, iki genel tipte şey vardır: tanımlı türdeki bir depolama yerinin gerçekte bu tür bir nesneyi tutacağı ve tanımlı türde bir depolama yerinin, bu türdeki bir nesneyi referans tutacağı başka bir yerde saklanır. Ayrıca, sunabileceği çok sayıda semantik şey vardır:

  1. Ölümsüz değer semantiği: Belirli bir tipteki örneklerin, kimliğin temelini oluşturan bazı özellikleri ("değer") vardır. Değeri eşit olan iki öğe, nerede depolandıklarına bakılmaksızın, birbirinin yerine kullanılabilir. Değer, mevcut olduğu sürece sabit olacaktır. Böyle bir tipte bir değişken, değerinin değişmesine neden olabilir, ancak sadece farklı bir örneği değişkene saklayarak değişebilir.
  2. Ölümsüz referans semantiği: genellikle farklı zamanlarda oluşturulan iki durumun kendilerini farklı örnekler olarak rapor etmeleri dışında, değişmez değer semantiğine benzer.
  3. Değişebilir değer semantikleri: Belirli bir tipteki örneklerin, kimliğin temelini oluşturan bazı karakteristik veya karakteristikler ("değerler") koleksiyonu vardır, ancak bu özellikler tüm örneği değiştirmeden değiştirilebilir. Her örnek tam olarak bir değişken veya alanda saklanır; Bir değişken veya alanın bir diğerine kopyalanması, tüm değerleri ilk örneklemden diğerine kopyalar, ancak örnekler ayrı kalır. Bir örneğe gelecekteki değişiklikler diğerini etkilemez.
  4. Değişken referans semantiği: her örnek kendi başına özdeştir, ancak başka hiçbir varlık değildir ve örneklerin var olan örneklerde değiştirilebilecek bir veya daha fazla değeri vardır. Herhangi bir sayıda değişken veya alan herhangi bir örneğe referans gösterebilir. Bir veya alan değişkenini diğerine kopyalamak, ikinci olarak sadece diğeriyle aynı örneği gösterir. Sonuç olarak, değişkenlerden biri tarafından atıfta bulunulan durumdaki herhangi bir değişiklik, diğeri tarafından atıfta bulunulan durumu (yani aynı örnek) etkileyecektir.

C ++ gibi bazı programlama dillerinde, hem doğrudan depolanmış hem de dolaylı referans türlerinin yukarıda belirtilen dört türden birini uygulamak mümkündür. .Net ve C # 'da, açık alanlara sahip doğrudan depolanmış tipler her zaman # 3 uygular, açık alanlara sahip sınıf tiplerini her zaman uygular # 4, diğer değer türleri yukarıdakilerin herhangi birini uygulayabilir ve diğer referans türleri # 1, # 2'yi uygulayabilir veya # 4, ama # 3 değil, sadece hafif sızdıran bir soyutlama ile. Dizeler # 1'i uygular.


3
2017-12-10 21:14





Belki makale .NET ve C # dizeleri size yardımcı olabilir. Bu makaleye göre, dize bir referans türüdür.


2
2017-07-01 13:33