Szukaj…


Wprowadzenie

Operator nameof pozwala uzyskać nazwę zmiennej , typu lub elementu w postaci łańcucha, bez kodowania go jako literału.

Operacja jest oceniana w czasie kompilacji, co oznacza, że możesz zmienić nazwę identyfikatora, do którego się odwołujesz, używając funkcji zmiany nazwy IDE, a ciąg nazwy zostanie zaktualizowany wraz z nim.

Składnia

  • nameof (wyrażenie)

Podstawowe użycie: Drukowanie nazwy zmiennej

Operator nameof pozwala uzyskać nazwę zmiennej, typu lub elementu w postaci łańcucha, bez kodowania go jako literału. Operacja jest oceniana w czasie kompilacji, co oznacza, że możesz zmienić nazwę, używając funkcji zmiany nazwy IDE, identyfikatora, do którego istnieje odniesienie, i ciąg nazwy zostanie zaktualizowany wraz z nim.

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

Wyjdzie

myString

ponieważ nazwa zmiennej to „myString”. Refaktoryzacja nazwy zmiennej zmieni łańcuch.

W przypadku wywołania typu nameof operator nameof zwraca nazwę bieżącego odwołania, a nie nazwę lub nazwę typu obiektu bazowego. Na przykład:

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

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

Drukowanie nazwy parametru

Skrawek

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

...

int myValue = 10;
DoSomething(myValue);

Wyjście konsoli

paramValue

Podnoszenie zdarzenia PropertyChanged

Skrawek

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";

Wyjście konsoli

Adres

Obsługa zdarzeń Zmienione zdarzenia

Skrawek

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;

Wyjście konsoli

Tytuł zmieniono na Everything is fire and broken

Status zmieniono na ShowStopper

Stosowany do parametru typu ogólnego

Skrawek

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

...

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

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

Wyjście konsoli

Temat

SomeClass

Stosowany do kwalifikowanych identyfikatorów

Skrawek

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

Wyjście konsoli

MyNamespace

Moja klasa

MyNestedClass

MyStaticProperty

Sprawdzanie argumentów i klauzule ochronne

Woleć

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

Nad

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

Korzystanie z funkcji nameof ułatwia refaktoryzację parametrów metody.

Silnie wpisane linki akcji MVC

Zamiast zwykłego luźno wpisanego:

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

Możesz teraz mocno wpisywać linki akcji:

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

Teraz, jeśli chcesz zmienić kod i zmienić nazwę metody UserController.LogIn na UserController.SignIn , nie musisz się martwić o wyszukiwanie wszystkich ciągów znaków. Kompilator wykona zadanie.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow