2010-11-14 16 views

cevap

23

Muhtemelen uyarı CS1690, üreme kodu bahsediyoruz:

public class Remotable : MarshalByRefObject { 
    public int field; 
} 
public class Test { 
    public static void Run() { 
     var obj = new Remotable(); 
     // Warning CS1690: 
     Console.WriteLine(obj.field.ToString()); 
    } 
} 

bir uzak senaryoda, Test.Run yöntemi Kumandalı nesnenin bir proxy ile çalışacaktır. Bir özellik, yöntem veya olay için bir vekil oluşturma, bir çok sorun değildir, sadece ikame içeren bir MethodTable oluşturma sorunu. Alanlar sorun olsa da, 'kanca' için bir şey yok. Bir MBRO için, JIT derleyicisi artık alana doğrudan erişmek için kod üretmez, bu durumda CLR, JIT_GetField32() içine yerleştirilmiş bir yardımcı yönteme çağrı gönderir.

Bu yardımcı, nesnenin bir proxy olup olmadığını kontrol eder ve eğer durum buysa, uzak değeri elde etmek için uzaktaki sıhhi tesisat sistemini kullanır. Ya da değilse doğrudan alana erişir. ToString() çağrısı yapmak, ancak kutunun değerini gerektirir. Bu bir sorun, boks proxy'den değeri ayırır. Kutulu değerin, her zaman, uzak bir değerin doğru bir kopyasının olduğundan emin olmanın hiçbir yolu yoktur. ToString() yöntemi dizgiyi biçimlendirmek için değeri kullanmıyorsa, JIT_GetField32() öğesini tekrar çağırmak mümkün değildir.

CS1690 için geçici çözüm, alanı bir özellik ile sarmanın ötesinde basittir, sadece alan değerini yerel bir değişkene kopyalamanız yeterlidir. Şimdi, kodun bir kopya ile çalıştığı ve hiçbir zaman bir sürpriz olmadığından, derleyicinin bir uyarı vermesi gerekmediği açıktır. hans-passant @ gelen öneri yanısıra

public static void Run() { 
    var obj = new Remotable(); 
    var value = obj.field; 
    Console.WriteLine(value.ToString());  // No warning 
} 
+1

Çok teşekkürler. Bu uyarıyı yeni aldım ve burada bir cevabın olması için yeterince şanslıydı. –

+0

Bunu yapmak için »var i = obj.alan; Console.WriteLine (i.ToString()); '? –

0

Köşeli nesnenin diğer tarafı ölmüşse, başvurulan nesnenin artık mevcut olmadığını belirten bir çalışma zamanı hatası atacaktır.

3

, ben bu uyarıyı düzeltmek için başka bir faydalı bir yol bir özellik haline alanını çevirerek olduğunu düşünüyorum.

public class Remotable : MarshalByRefObject { 
    public int field; 
} 

public class Remotable : MarshalByRefObject { 
    public int field { get; set } 
} 

haline gelebilir ve artık herhangi bir uyarı olsun! (Hans Passant zaten bunun için mükemmel bir açıklamaya sahiptir, bkz. his post)

Açıkçası, birlikte çalıştığınız nesneyi her zaman değiştiremezsiniz (örneğin, alanların sizin için oluşturulduğu WinForms), böylece geri dönüş yapmanız gerekebilir geçici bir değişken kullanarak.

0

Yoksa yazabilirsiniz: Burada

var obj = new Remotable(); 

Console.WriteLine(((int) obj.field).ToString());  // No warning 

o döküm (kutudan çıkarma) için kendi sorumluluk almak.

İlgili konular