C# Language
nome dell'operatore
Ricerca…
introduzione
L'operatore nameof
consente di ottenere il nome di una variabile , di un tipo o di un membro in forma stringa senza codificarlo come letterale.
L'operazione viene valutata in fase di compilazione, il che significa che è possibile rinominare un identificatore di riferimento, utilizzando la funzione di ridenominazione di IDE e la stringa di nome verrà aggiornata con esso.
Sintassi
- nameof (espressione)
Utilizzo di base: stampa di un nome di variabile
L'operatore nameof
consente di ottenere il nome di una variabile, di un tipo o di un membro in forma stringa senza codificarlo come letterale. L'operazione viene valutata in fase di compilazione, il che significa che è possibile rinominare, utilizzando la funzione di ridenominazione di IDE, un identificatore di riferimento e la stringa di nome si aggiornerà con esso.
var myString = "String Contents";
Console.WriteLine(nameof(myString));
Uscirebbe
mystring
perché il nome della variabile è "myString". Il refactoring del nome della variabile cambierebbe la stringa.
Se chiamato su un tipo di riferimento, il nameof
operatore restituisce il nome del riferimento corrente, non il nome o il nome del tipo dell'oggetto sottostante. Per esempio:
string greeting = "Hello!";
Object mailMessageBody = greeting;
Console.WriteLine(nameof(greeting)); // Returns "greeting"
Console.WriteLine(nameof(mailMessageBody)); // Returns "mailMessageBody", NOT "greeting"!
Stampa di un nome parametro
Frammento
public void DoSomething(int paramValue)
{
Console.WriteLine(nameof(paramValue));
}
...
int myValue = 10;
DoSomething(myValue);
Uscita console
paramValue
Aumentare l'evento PropertyChanged
Frammento
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";
Uscita console
Indirizzo
Gestione degli eventi PropertyChanged
Frammento
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;
Uscita console
Titolo cambiato in Tutto è in fiamme e rotto
Stato cambiato in ShowStopper
Applicato a un parametro di tipo generico
Frammento
public class SomeClass<TItem>
{
public void PrintTypeName()
{
Console.WriteLine(nameof(TItem));
}
}
...
var myClass = new SomeClass<int>();
myClass.PrintTypeName();
Console.WriteLine(nameof(SomeClass<int>));
Uscita console
TItem
SomeClass
Applicato agli identificatori qualificati
Frammento
Console.WriteLine(nameof(CompanyNamespace.MyNamespace));
Console.WriteLine(nameof(MyClass));
Console.WriteLine(nameof(MyClass.MyNestedClass));
Console.WriteLine(nameof(MyNamespace.MyClass.MyNestedClass.MyStaticProperty));
Uscita console
MyNamespace
La mia classe
MyNestedClass
MyStaticProperty
Argument Checking and Guard Clauses
Preferire
public class Order
{
public OrderLine AddOrderLine(OrderLine orderLine)
{
if (orderLine == null) throw new ArgumentNullException(nameof(orderLine));
...
}
}
Al di sopra di
public class Order
{
public OrderLine AddOrderLine(OrderLine orderLine)
{
if (orderLine == null) throw new ArgumentNullException("orderLine");
...
}
}
L'uso della funzione nameof
semplifica il refactoring dei parametri del metodo.
Link di azione MVC fortemente tipizzati
Invece dei soliti caratteri tipografici:
@Html.ActionLink("Log in", "UserController", "LogIn")
Ora puoi creare link di azione fortemente digitati:
@Html.ActionLink("Log in", @typeof(UserController), @nameof(UserController.LogIn))
Ora, se si vuole refactoring il codice e rinominare UserController.LogIn
metodo per UserController.SignIn
, non è necessario preoccuparsi di ricerca di tutte le occorrenze della stringa. Il compilatore farà il lavoro.