サーチ…


前書き

nameof演算子を使用すると、 変数またはメンバの名前をリテラルとしてハードコードすることなく、文字列形式で取得できます。

操作はコンパイル時に評価されます。つまり、IDEの名前変更機能を使用して参照先の識別子の名前を変更することができ、名前文字列が更新されます。

構文

  • 名前(式)

基本的な使い方:変数名の印刷

nameof演算子を使用すると、変数、型またはメンバの名前をリテラルとしてハードコードすることなく、文字列形式で取得できます。操作はコンパイル時に評価されます。つまり、IDEの名前変更機能を使用して、参照された識別子を名前変更し、名前文字列をその名前で更新します。

var myString = "String Contents";
Console.WriteLine(nameof(myString));

出力するか

myString

変数の名前が "myString"であるためです。変数名をリファクタリングすると文字列が変更されます。

参照型で呼び出された場合、 nameof演算子は、基になるオブジェクトの名前または型名ではなく 、現在の参照の名前を返します。例えば:

string greeting = "Hello!";
Object mailMessageBody = greeting;

Console.WriteLine(nameof(greeting)); // Returns "greeting"
Console.WriteLine(nameof(mailMessageBody)); // Returns "mailMessageBody", NOT "greeting"!

パラメータ名の印刷

スニペット

public void DoSomething(int paramValue)
{
    Console.WriteLine(nameof(paramValue));
}

...

int myValue = 10;
DoSomething(myValue);

コンソール出力

paramValue

PropertyChangedイベントの発生

スニペット

public class Person : INotifyPropertyChanged
{
    private string _address;

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public string Address
    {
        get { return _address; }
        set
        {
            if (_address == value)
            {
                return;
            }

            _address = value;
            OnPropertyChanged(nameof(Address));
        }
    }
}

...

var person = new Person();
person.PropertyChanged += (s,e) => Console.WriteLine(e.PropertyName);

person.Address = "123 Fake Street";

コンソール出力

住所

PropertyChangedイベントの処理

スニペット

public class BugReport : INotifyPropertyChanged
{
    public string Title { ... }
    public BugStatus Status { ... }
}

...

private void BugReport_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    var bugReport = (BugReport)sender;

    switch (e.PropertyName)
    {
        case nameof(bugReport.Title):
            Console.WriteLine("{0} changed to {1}", e.PropertyName, bugReport.Title);
            break;

        case nameof(bugReport.Status):
            Console.WriteLine("{0} changed to {1}", e.PropertyName, bugReport.Status);
            break;
    }
}

...

var report = new BugReport();
report.PropertyChanged += BugReport_PropertyChanged;

report.Title = "Everything is on fire and broken";
report.Status = BugStatus.ShowStopper;

コンソール出力

タイトルがすべてに変わった

ステータスがShowStopperに変更されました

ジェネリック型パラメータに適用されます。

スニペット

public class SomeClass<TItem>
{
    public void PrintTypeName()
    {
        Console.WriteLine(nameof(TItem));
    }
}

...

var myClass = new SomeClass<int>();
myClass.PrintTypeName();

Console.WriteLine(nameof(SomeClass<int>));

コンソール出力

TItem

SomeClass

修飾された識別子に適用される

スニペット

Console.WriteLine(nameof(CompanyNamespace.MyNamespace));
Console.WriteLine(nameof(MyClass));
Console.WriteLine(nameof(MyClass.MyNestedClass));
Console.WriteLine(nameof(MyNamespace.MyClass.MyNestedClass.MyStaticProperty));

コンソール出力

MyNamespace

私のクラス

MyNestedClass

MyStaticProperty

引数チェックとガード句

好む

public class Order
{
    public OrderLine AddOrderLine(OrderLine orderLine)
    {
        if (orderLine == null) throw new ArgumentNullException(nameof(orderLine));
        ...
    }
}

オーバー

public class Order
{
    public OrderLine AddOrderLine(OrderLine orderLine)
    {
        if (orderLine == null) throw new ArgumentNullException("orderLine");
        ...
    }
}    

nameofフィーチャを使用すると、メソッドパラメータを簡単にリファクタリングできます。

強く型付けされたMVCアクションリンク

通常の緩やかな型付けの代わりに:

@Html.ActionLink("Log in", "UserController", "LogIn")

強く型付けされたアクションリンクを作成できるようになりました:

@Html.ActionLink("Log in", @typeof(UserController), @nameof(UserController.LogIn))

あなたのコードをリファクタリングし、名前を変更したい場合は今UserController.LogInにメソッドをUserController.SignIn 、あなたはすべての文字列の出現を検索を心配する必要はありません。コンパイラがその作業を行います。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow