2013-09-29 12 views
5

Son zamanlarda C# 'de değişebilir ve değişmez nesneler üzerinde okumaya başladım ve okuduğum her yerde bulabildiğim sabit şey, imkansız olan bir şey anahtarlar olarak kullanıldığında işleri güvenilir ve kullanışlı hale getiriyor hashtables ama ne ben anlamıyorum kadarıyla konsept içerikleri değiştiremezsiniz ederken olduğu başvuru değiştirebilir gider gibidir:"Immutable string'ler threadafe" ile ne ifade ediyor

string s = "Hi"; 
s = "Bye"; 

burada iken s referans için "Bye" değiştirilir ama ana şey, s içeriğinin (ya da daha doğrusu işaret ettiği) değişmiş olmasıdır ve programlama bakış açısıyla aynıdır, bu, eğer string değiştirilirse, belirli bir işlevi threadafe veya hashtable olarak kullanılabilir hale getirir? ?

+0

http://stackoverflow.com/questions/2365272/why-net-string-is-immutable –

+0

@Soner Gönül'e bir göz atın: bunu okuyun… m soran ... –

cevap

0

Örneğinizde, farklı bir string nesnesine ("Güle") başvuruda bulunmak üzere yeniden atanır, ancak daha önce başvurulan s ("Merhaba") değişmemiş olan nesne değişmedi. "Merhaba" dizesine (başka bir iş parçacığı, bir Dictionary, vb.) Başvurusu olan başka bir şey etkilenmez. Bahsettiğiniz gibi, string değişmezdir - içerik oluşturulduktan sonra değiştirilemez. Örneğin, bir başka string eklerseniz, yeni bir string nesnesi alırsınız. İki orijinal string nesnesi aynı kalır. string iş parçacığı güvenli kılan ve bir hashtab içinde kullanıma uygun olan budur.

sdeğil referans parçacığı güvenli - bir başvuru kullanırken iplik güvenliğini sağlamak için, bir iş parçacığı okuma girişiminde bulunmadı sağlamak için referans atama etrafında bir kilit koymak gerekirdi Başka bir iş parçacığı yazarken referans.

+0

"" Merhaba "(başka bir konu, bir Sözlük, vb) dizesine bir referansı olan başka bir şey etkilenmeyecek" - orijinal durumda bu durumda GC için gitmeyecek? ve GC için giderse, iş parçacığı ya da dict yıkmak .... .... ne olur? Bu durumda ne ifade eder? Ayrıca jdv-Jan de Vaan hakkında ikinci yorumum hakkında sözlükler de burada geçerlidir ... bu durumda ne olurdu? –

2

Basit. Farklı bir iş parçacığı üzerinde çalışan kod için s geçirecekseniz, bu kod, parametre iletildikten sonra s tarafından işaret edilen dizeyi alır. .net'deki tüm dizeler gibi, zamanla değişmeyecektir, bu nedenle, dişli kodunuzun s'u farklı bir değere yeniden atayabileceğinizi hesaba katması gerekmez.

"Bye" öğesini s'a atarsanız, orijinal dize (toplanan çöp alana kadar) ve değişkeniniz s yeni bir dizeye işaret eder.

Sözlüklerde biraz farklıdır. Değiştirilebilir anahtarınızı, kod kodu değişecek şekilde değiştirirseniz, sözlük anahtarı bulamaz: Hash kod bir indekste arama yapmak için kullanılır ve hashcode zamanla değişirse sözlük doğru kaydı bulamaz. Yani bu gerçekten de değişmezlik gerektirmez, fakat değişmezlik, tutarlı bir şekilde şifrelerin hesaplanmasını sağlar.

Sizin için ne değişmezlik yaparsa, nesneyi akılda tutulması daha kolay olan bir değer türü (int gibi) düşünebilme yeteneğini verir.

+0

tamam ...... ama bu dize değişebilir varsayarak varsayalım ... eğer farklı bir iş parçacığı üzerinde çalışan bir kod için bir değişken olarak geçtiysem ... Bu geçtiğim sürümü olurdu ve bununla çalışır Daha sonra değiştirmiş olsam bile veriler doğru mu? –

+0

da sözlükte örn.Eğer karma değiştiyse, anahtarın bulunamayacağını, ancak değişmez dizeyle aynı olmayacağını söylüyorsunuz? dize, GC için bellekte olsa bile, o verileri içermeyen bir değişkeni işaret eder, böylece başvurulan verileri değiştirdim ... –

+0

İlk yorumunuz için: eğer dizeler değişebilir ise, bir dizesini farklı bir iş parçacığına geçirdikten sonra ve bu iş parçacığı değişikliği görebiliyordu. –

İlgili konular