2012-02-11 10 views
5

String nesnesi, == ve = kullanılırken bir Değer türü gibi davranır; = işleç, başvuru yerine gerçek nesne anlamına gelir.Bir String türünün bir Metoda Geçirilmesi veya C# 'da Değişken Atanması Nasıl Sağlanır?

Parametre geçirme, atama ve kopyalama hakkında ne dersiniz?

Yaylı Parametre Geçiş: başvuru türü bir yönteme geçirildiğinde, referans kopyalanır ancak altta yatan amacı, aynı kalır.

Bu, C# ile Dize türü hakkında da doğru olabilir mi? Bir değişkene atanmış

public static void main() 
{ 
    string messageVar = "C#"; 
    Test(messageVar); 

    // what about in assignement? 
    string messageVar2 = messageVar; 
} 
public void Test(string messageParam) 
{ 
// logic 
} 

Ne zaman hakkında: Ben 2 işaretçiler (messageVar ve messageParam) altına kodunda aynı nesneye işaret çıkmasına neden? Bence, referans sadece kopyalanacaktır ve asıl nesne String Intern Pool'da önbelleğe alınmış aynı kalır. Emin değil.

messageVar2 aynı nesneyi de gösterir mi?

Teşekkürler,

cevap

3

Evet, yalnızca referanslar kopyalanır, başvurulan nesne örneği başvurulan tek ve aynıdır.

Kolayca iki referanslar aynı nesne örneğine nokta olmadığını test etmek Object.ReferenceEquals() kullanarak doğrulayabilirsiniz - Bu göstermek için örnek biraz modifiye:

static string messageVar = "C#"; 
public static void Main(string[] args) 
{ 
    bool isSame = Test(messageVar); //true 

    // what about in assignement? 
    string messageVar2 = messageVar; 
    isSame = Object.ReferenceEquals(messageVar2, messageVar);//also true 
} 

public static bool Test(string messageParam) 
{ 
    // logic 
    bool isSame = Object.ReferenceEquals(messageParam, messageVar); 
    return isSame; 
} 
+0

nice; Dizelerle çalışırken Object.Equals ve Object.ReferenceEquals arasındaki fark nedir? –

+0

Dizeler için 'Equals()', referanstan bağımsız olarak * dize eşitliği * için test yapar. "foo", her iki dizenin farklı nesne örneklerine işaret edip etmediğine bakılmaksızın "foo" değerine eşittir – BrokenGlass

0

Bu tam olarak ne oluyor.

string s ile küçük bir bükülme, değişmez olmalarıdır: dizgiyi değiştiren gibi görünen herhangi bir işlem aslında yeni bir tane oluşturur. Böylece dizeler oluşturulduktan sonra değiştirilemez. Bunun yanı sıra, dizeler başka herhangi bir referans türü gibi çalışır: referans olarak erişilir ve bir işleve aktarılırlar, referansın bir kopyasını geçirir (ref veya out'u kullanmadığınız sürece), böylece işlevdeki referansı değiştirmez. çağıran koddaki değer.

2

“Dize nesnesi Değer türü gibi davranır == ve = kullanılırken, referans yerine asıl nesne anlamına gelen işleçler kontrol edilir. ”

String sınıfı, bu konuda herhangi bir özel tedavi (dil seviyesinde) alamaz. == ve != işleçlerinin dizelerin değerlerini (referanslardan ziyade) karşılaştırmasının nedeni, aşırı yüklenmiş; String.Equality Operator ve String.Inequality Operator'a bakınız.

Kullanıcı tanımlı herhangi bir sınıf, bu iki işleçleri, nesne değerleri üzerinde eşitlik karşılaştırmaları gerçekleştirmek için de aşırı yükleyebilir (ancak bu genellikle yalnızca String gibi değişmez türler için önerilir).

İlgili konular