20

次の C#6 コードを使用したい

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

...そして、次の出力を取得します。

ジョー

次の試み

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

nameofに適用できないため、失敗しますthis。この問題の回避策はありますか?

編集。私が取り組んでいるシナリオでは、2 つの参照が同じSelfオブジェクトを指していないことが保証されています。

4

5 に答える 5

18

いいえ、nameof参照しているメンバーのコンパイル時の名前を参照するように設計されています。Nameオブジェクトにその状態の一部としてプロパティを持たせたい場合、それはプロパティに到達する方法とは無関係ですName- フレデリック・ハミディが言うように、同じオブジェクトを参照する複数の変数 (または変数なし) が存在する可能性があります。基本的に、オブジェクトとそのオブジェクトを参照する変数を区別する必要があります。

ただし、名前を指定するコンストラクターがある場合は、いくつかのトリックを使用して正しい名前を簡単に取得できます。

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));
    }
}
于 2015-01-08T10:33:57.893 に答える
6

nameof変数自体で簡単に使用できます。

Console.WriteLine(nameof(joe));

現在の Roslyn バージョンを使用した実際の例を次に示します

于 2015-01-08T10:33:25.043 に答える
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); } 
于 2016-01-10T18:43:20.427 に答える