2015-01-08 33 views
7

我想用下面的C#代碼6如何處理nameof(本)報告類名

var joe = new Self(); 
Console.WriteLine(joe); 

...並得到下面的輸出:

joe

的以下嘗試爲nameof不能應用於this

class Self { 
    public string Name { get; set; } = nameof(this); 
    public override string ToString() { 
    return Name; 
    } 
} 

失敗。是否有解決此問題的方法?

編輯。我正在處理的場景確保沒有兩個引用指向相同的Self對象。

+4

我不這麼認爲。考慮'var joe = new Self(); var jack = joe;'。應該'Name'返回''joe「',''jack」',還是兩者? –

+1

'nameof(joe)' – i3arnon

+0

有什麼問題你可以從這篇文章中學到一些名字(..)的用法:http://www.spicelogic。com/Journal/C-sharp-6-most-exciting-features-9 –

回答

6

您可以直接在變量本身使用nameof

Console.WriteLine(nameof(joe)); 

Here「SA使用當前羅斯林版本

13

沒有工作的例子,nameof是專指的編譯時的名字你所指的成員。如果你想要一個對象擁有Name屬性作爲其狀態的一部分,那麼與你的得到屬性的Name屬性無關 - 正如FrédéricHamidi所說的那樣,可能有多個變量(或沒有)指向同一個對象。基本上你需要區分一個對象和一個碰巧指向那個對象的變量。

但是,如果你有一個構造函數指定名稱,然後你可以使用一些技巧,使其更容易得到正確的名稱:

class Self 
{ 
    public string Name { get; } 

    public Self([CallerMemberName] string name = null) 
    { 
     this.Name = name; 
    } 
} 

然後:

class Foo 
{ 
    private Self me = new Self(); // Equivalent to new Self("me") 

    public void SomeMethod() 
    { 
     // Can't use the default here, as it would be "SomeMethod". 
     // But we can use nameof... 
     var joe = new Self(nameof(joe)); 
    } 
} 
0

nameof的想法是爲了在運行時指定程序元素而使用編譯時類型安全檢查來確保類型安全。

應該是霧化想要展示什麼。例如,在我的錯誤消息,包括我的類名稱的相關信息和方法本身和它的檢查,所以如果我改變任何他們被發現作爲一個編譯時錯誤的名字:

class Operation 
{ 
    public void Execute() 
    { 
    try { ... } 
    catch (Exception ex) 
    { 
    Console.Writeline($"{nameof(Operation)}.{nameof(Execute)} has encountered exception:{Environment.NewLine}{Environment.NewLine}{ex.Message}"); 
    } 
    } 
} 

輸出

Operation.Excecute has exception: 
... 

雖這麼說,你應該重寫ToString()和報告類名這樣

public override string ToString() { return nameof(Self); }