Sana Cache
nesnenin birçok kopya oluşturuldu alacak merak düşünüyorum. Birden çok istemci nesnesi tarafından yalnızca bir kopyanın paylaşılmasını istiyorsunuz. Nesnenizin kaç kopyasının oluşturulacağını bilmek istediğinizde C# 'da hatırlayabileceğiniz çok basit bir kural var. new
anahtar kelime ile:
nesnenin tip ile class
anahtar kelime ilan edilirse, o zaman yeni bir örneğini yapmak için tek bir yolu vardır. Nesneleri oluşturmak BCL yöntemlerini çağırabilir, ama mesele o açık olmasıdır:
bu ufak çaplı istisnası yoktur. Bunun olmasını özellikle istemelisiniz. Dil, otomatik olarak class
nesnenin kopyasını oluşturmaz.
Yani örnekte, bir
class
Cache
denilen var ve siz istediğiniz kadar ve
Cache
ait başka kopya oluşturulacak tip
Cache
değişkenlerini dolaşması gerekiyor böylece kesin olarak biliyoruz. Onlara atanan nesneye sahip olan tüm değişkenler aynı orijinal nesneye "işaret eder". Bir
Cache
değişken nesneyi kendisi ama bellekte bir
Cache
nesnenin sadece konumunu saklamaz olmasıdır. bunun yerine
class
bir
struct
türü bildirmek ne olur bu
Kontrast. Eğer bu tür bir değişkeni bildirmek Şimdi, değişken kendisi struct
beyan tüm veri depolamak için yeterli büyüklükte olmalıdır. Her değişken ayrı bir kopyadır. Her parametre ayrı bir kopyadır.
Sen ref
anahtar kelime ekleyerek bu geçersiz kılabilir, ancak çoğu programlarında oldukça alışılmadık kelime bu. out
anahtar sözcüğü daha yaygındır ve bir yönteme birden fazla dönüş değeri vermenin bir yolu olarak düşünülür.
o class
türü ise ref
bir değişken üzerinde ne gibi etkisi? Örnekte:
public ObjectLoader(Cache cache) {
// do stuff with cache (store it?)
}
böyle iki nesne yükleyiciler olustursaydiniz:
Cache c = new Cache();
ObjectLoader a = new ObjectLoader(c),
ObjectLoader b = new ObjectLoader(c);
biz sadece kaç nesneleri yarattı? Sadece new
anahtar kelimeleri sayın. Şimdi, biz ref
anahtar kelime eklendi varsayalım:
public ObjectLoader(ref Cache cache) {
_cache = cache; // store
// do something very odd!
cache = new Cache();
}
o kurucu içinde, başka bir önbellek oluşturduk Gizli ve ben geçirildi parametrede depoladı. Bu bir
ref
parametresi olduğundan, arayanın değişkenini etkiledim! arama kodunda Yani: Yukarıdaki kod parçasında üç artı modifiye
ObjectLoader
kurucusuna iki çağrı:
Cache c = new Cache();
ObjectLoader a = new ObjectLoader(ref c),
ObjectLoader b = new ObjectLoader(ref c);
Şimdi new
beş kullanımları vardır. Her zaman ObjectLoader
yapıcısı çağrılır, biz c
iletiriz. Biz kod okuma kişi garip bir şey oluyor bilirler çünkü çok iyi bir şeydir ref
anahtar kelimeyi koymak zorunda.c
değişkeni, ObjectLoader
yapıcısının döndürülmesinden sonra farklı bir Cache
işaret eder. Yani b
's ObjectLoader
bir işaretçiyi a
için Cache
farklı bir yere depolamak kadar biter!
Söylemeye gerek yok, bu kod için oldukça dağınık bir desen olurdu. Çağıran sitede ref
anahtar kelimesini koymak zorunda kalmazsak daha da kötü olur!
Normal C/C++ işaretçileri ile çok daha basit :) – Eugene
Katılmıyorum :) Ama c/C++ insanlar için * (veya &) ve ** :) – Stormenet
nitpick arasındaki fark: 2. örnek - siz statik bir özelliğe erişim. – Cherian