C# Language
演算子の名前
サーチ…
前書き
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
、あなたはすべての文字列の出現を検索を心配する必要はありません。コンパイラがその作業を行います。