2016-09-10 14 views
5

Sadece C# 6'dan gelen statik olmayan özelliklerin statik gibi erişebildiğini merak ediyorum. İşte O mülkiyet "erişme" değil bir örnekAdı nasıl çalışır?

public class TestClass 
{ 
    public string Name { get; set; } 
} 

public class Test 
{ 
    public Test() 
    { 
     string name = nameof(TestClass.Name); // whats so speciall about nameof 
     //string name2 = TestClass.Name; this won't compile obviously, 
    } 
} 
+6

de Bu konuda özel bir şey yok. Bu, çalışma zamanında değil, derleme zamanında gerçekleşir. Ve derleyici adının bir üyesini bir dize değişmezine (Name name) dönüştürmek için hiçbir problemi yoktur. Bu konuda garip olan tek şey, dilin eklenmesi için 6 sürüm almasının nedeniydi :) –

+0

Ne demek "nameof' nasıl çalışıyor?" Neden işe yaramıyor? Aynı soruya sahip misiniz? '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '] Bunlardan _any_ nasıl çalışır? Derleyici bunları anlamak ve onları gördüklerinde doğru derlenmiş kodu oluşturmak için yazılmıştır. Derleyicilerin nasıl çalıştığı hakkında bir açıklama mı arıyorsunuz? Sonra, "çok geniş". Eğer değilse, o zaman gerçekten soruyorum _what_. Lütfen aslında neyin dalga geçtiğini açıkla. –

+0

cevabınızı burada bulabilirsiniz: http://stackoverflow.com/questions/31695900/what-is-the-purpose-of-nameof –

cevap

8

- yani operatör tamamen koduna Tartışmanın "adı" enjekte etmek bir derleyici mekanizmadır. Bu durumda 'u "Name" ile değiştirecektir. Statik olmayan olması gerçeği alakasız.

+5

"" TestClass.Name "ile değiştirilecek" TestClass.Name "' "Hayır, sadece" Name "ile değiştirilecektir. – svick

+3

Ayrıca, "adınız" özel üyelere erişemiyor, kodunuz iyi çalışmıyor, başarısız oluyor: "CS0122 'AY' koruma seviyesi nedeniyle erişilemiyor" – svick

+0

Peki bu işe yarıyor [burada] (http: // ideone .com/GG9VcU) fakat bu kısmı soruyla alakalı olmadığı için aldım. –

3

nameof Tercüman, compiletime adresinde çözülür ve bunun yerine static string'a çevrilir.
Sizin durumunuzda nameof(TestClass.Name) sadece "Name" dizgisi olarak döneceksiniz.
nameof(TestClass) kullanmanız gerekir. Eğer Örneğin (kodunuzda tekrarları en aza indirmek için nameof ile
. Eğer nameof kullanarak böyle bir mülküne veya bir yerde dize tanımlamak zorunda değilsin

Ayrıca sınıflar adını temsil için kullanabilirsiniz Ama olabilir. Eğer bir türetilmiş sınıf varsa farkında! nameof(MyClass)
zamanında aynı olmayabilir! çalışma zamanı amaçları typeOf ya da bunun yerine .GetType() kullanın.

devamı MSDN