9

新しいC# 6.0nameofは、次のPropertyChangedようなものを使用してプロパティの変更を伝達するパターンに優れています。

private string _myProperty;

public string MyProperty
{
    get
    {
        return _myProperty;
    }
    set
    {
        _myProperty= value;
        OnPropertyChanged(nameof(MyProperty));
    }
}

プロパティの変更をリッスンするときは、これを使用します(はい、ハードコードされた文字列が醜い場合でも):

    private void OnMyObjectPropertyChanged(object sender, PropertyChangedEventArgs args)
    {
        switch (args.PropertyName)
        {
            case "MyProperty":
                DoSomething();
                break;
        }
    }

新しい nameof 式を使用すると、このコードはコンパイル/動作しますか?

private void OnMyObjectPropertyChanged(object sender, PropertyChangedEventArgs args)
{
    switch (args.PropertyName)
    {
        case nameof(MyObject.MyProperty):
            DoSomething();
            break;
    }
}
4

1 に答える 1

15

この質問によると、nameofキーワードの評価はコンパイル時に行われます。これにより定数になり、switchステートメント内で機能します。

これは、このコードのコンパイル済み出力を見ると証明されます。

using System;

public class Program
{
    public string A { get; set; }

    public static void Main()
    {
        string a = "A";

        switch (a)
        {
            case nameof(Program.A):
            {
                Console.WriteLine("Yes!");
                break;
            }
        }

    }
}

出力:

はい!

于 2015-05-07T10:02:27.887 に答える