SORU
9 ŞUBAT 2013, CUMARTESİ


Nesne başvurusu bir nesnenin örneğine ayarlanmadı.Neden't değil .`Boş nesne`olan NET gösterir?

Bu ilgili .NET işlenmeyen bir özel durum iletisi:

Nesne başvurusu bir nesnenin örneğine ayarlanmadı.

Neden gelmiyor .NET null hangi şov?

null için kontrol edin ve hatayı gidermek biliyorum. Ancak, neden yok .NET boş bir referans olan işaret Yardım ve anlatım NullReferenceException tetikledi?

CEVAP
9 ŞUBAT 2013, CUMARTESİ


Bu kodu göz önünde bulundurun:

String s = null;
Console.WriteLine(s.Length);

Bu NullReferenceException ikinci bir çizgi atar ve neden bilmek istiyorsunuz .NET olduğunda özel durum oluşturuldu boş olduğunu s olduğunu söylemiyor.

C unutmamalısınız bilgi parçasını alamadım neden anlamak# ama oldukça IL yürüten kaynak:

IL_0001:  ldnull      
IL_0002:  stloc.0     // s
IL_0003:  ldloc.0     // s
IL_0004:  callvirt    System.String.get_Length
IL_0009:  call        System.Console.WriteLine

O callvirt işlem kodu atar NullReferenceException ve o zaman ilk bağımsız değerlendirme yığın, bir null başvuru (yüklenmiş kullanarak ldloc.0).

Eğer .NET bir şekilde değerlendirme ilk argüman kökenli form yığını izlemek gerekir boş bir başvuru oldu s olduğunu söylemek mümkün s olmalıdır. Bu durumda bize boş ama eğer değer başka bir işlev çağrısının dönüş değeri olsaydı ne o s olduğunu görmek için kolay ve herhangi bir değişken içinde saklı değil mi? Her neyse, bu tür bilgileri takip etmek istediğin bir şey olmaması gibi bir sanal makine .NET sanal makine.


Bu sorunu önlemek için tüm kamu yöntem çağrıları elbette boş başvuru izin vermedikçe, (): argüman null kontrol gerçekleştirmenizi öneririm

public void Foo(String s) {
  if (s == null)
    throw new ArgumentNullException("s");
  Console.WriteLine(s.Length);
}

Null yöntemi geçirilir, tam olarak sorunun ne olduğunu açıklayan bir durum s null () olsun.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FILIPeeeK

    FILIPeeeK

    22 Mayıs 2006
  • Neil Cicierega

    Neil Ciciere

    22 Mart 2006
  • OVERWERK

    OVERWERK

    6 Temmuz 2010