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.

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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow