Önceki deneyimlerimden, null örneğinde uzantı yöntemlerini çağırmanın tamamen yasal olduğu (belki de önerilmez) olduğu izlenimindeydim. Yani C#, bu kod derlenmiş ve çalışan: AncakBu uzantı yöntemi neden VB.NET'te bir NullReferenceException kullanıyor?
// code in static class
static bool IsNull(this object obj) {
return obj == null;
}
// code elsewhere
object x = null;
bool exists = !x.IsNull();
, ben sadece benim geliştirme ekibinin diğer üyeleri için bir araya örnek kod biraz paketi koyarak edildi (biz sadece ve ben ettik .NET 3.5 yükseltilmiş Ekibimiz tarafından sunulan bazı yeni özelliklerin hızlandırılması görevini üstlendik.) ve ben 'un yukarıdaki kodun VB.NET eşdeğeri olduğunu düşündüğümü yazdım, sadece bir NullReferenceException
atar . Ben bir örnek yöntemi denir sanki
' code in module '
<Extension()> _
Function IsNull(ByVal obj As Object) As Boolean
Return obj Is Nothing
End Function
' code elsewhere '
Dim exampleObject As Object = Nothing
Dim exists As Boolean = Not exampleObject.IsNull()
ayıklayıcı, orada durur: Yazdığım kod bu oldu. Yanlış bir şey yapıyorum mu (örneğin, C# ve VB.NET arasındaki uzantı yöntemini tanımladığım şekilde bazı ince farklar var mı?)? Aslında C# 'de yasal olsa da, VB.NET'te boş bir örnek üzerinde bir uzantı yöntemini çağırmak için yasal değil mi? (Bunun bir dile özgü bir şeyin aksine bir .NET olayı olduğunu düşünebilirdim, ama belki de yanılmışımdır.)
Bunu bana açıklayan var mı?
ısnull yöntemi sadece bir örnektir mı yoksa aslında x.IsNull kullanmak istiyorsunuz vardır() 'x Nothing' veya 'x == null' yerine? – jrummell
@jrummell: Bu sadece bir örnek. Daha önce de belirttiğim gibi, bazı ekip üyelerim için uzatma yöntemlerinin nasıl çalıştığını göstermek için örnek bir kod yazıyordum. Bu yöntemin, "Bunu önerememesine rağmen, bunu aslında uzantı yöntemleriyle yapabilirsiniz." Başlıklı bir yorum eklemeyi planladım - sadece kaputun altında bir uzantı yönteminin gerçekten sadece statik olduğunu göstermek için) yöntem. Ama sonra beni şaşırttığını VB'de yapamadığımı keşfettim. –
Daha önce de bulunduğumuz gibi, bu sizin gibi geç bağlama desteğidir ... (VAR) VB'nin geç bağlama için böyle bir desteği olduğunu fark etmedim, bunun VB6 ile uyumluluk olduğunu düşünüyorum. Kısacası, eğer diğer geliştiriciler için bazı standartlar/eğitimler vermek istiyorsanız, Seçenek Strict'i görevlendirmek isteyebilirsiniz. Elbette YMMV. –