Looking for c# Keywords? Try Ask4Keywords

C# Language Имя оператора


пример

Оператор nameof возвращает имя элемента кода в виде string . Это полезно при бросании исключений, связанных с аргументами метода, а также при внедрении INotifyPropertyChanged .

public string SayHello(string greeted)
{
    if (greeted == null)
        throw new ArgumentNullException(nameof(greeted));
    
    Console.WriteLine("Hello, " + greeted);
}

Оператор nameof вычисляется во время компиляции и изменяет выражение в строковый литерал. Это также полезно для строк, названных в честь их члена, который их раскрывает. Рассмотрим следующее:

public static class Strings
{
    public const string Foo = nameof(Foo); // Rather than Foo = "Foo"
    public const string Bar = nameof(Bar); // Rather than Bar = "Bar"
}

Поскольку выражения nameof являются константами времени компиляции, их можно использовать в атрибутах, метках case , операторах switch и т. Д.


Удобно использовать nameof с Enum s. Вместо:

Console.WriteLine(Enum.One.ToString());

можно использовать:

Console.WriteLine(nameof(Enum.One))

В обоих случаях выход будет One .


Оператор nameof может обращаться к nameof элементам, используя синтаксис типа static. Вместо того, чтобы делать:

string foo = "Foo";
string lengthName = nameof(foo.Length);

Может быть заменено на:

string lengthName = nameof(string.Length);

В обоих примерах выход будет Length . Однако последний препятствует созданию ненужных экземпляров.


Хотя nameof оператора работает с большинством языковых конструкций, существуют некоторые ограничения. Например, вы не можете использовать оператор nameof для открытых общих типов или возвращаемых значений метода:

public static int Main()
{   
    Console.WriteLine(nameof(List<>)); // Compile-time error
    Console.WriteLine(nameof(Main())); // Compile-time error
}

Кроме того, если вы примените его к родовому типу, параметр родового типа будет проигнорирован:

Console.WriteLine(nameof(List<int>));  // "List"
Console.WriteLine(nameof(List<bool>)); // "List"

Дополнительные примеры см. В этом разделе, посвященном nameof .


Обходной путь для предыдущих версий ( подробнее )

Хотя оператор nameof не существует в C # для версий до 6.0, аналогичную функциональность можно использовать с помощью MemberExpression как MemberExpression ниже:

6,0

Выражение:

public static string NameOf<T>(Expression<Func<T>> propExp)
{
    var memberExpression = propExp.Body as MemberExpression;
    return memberExpression != null ? memberExpression.Member.Name : null;
}

public static string NameOf<TObj, T>(Expression<Func<TObj, T>> propExp)
{
    var memberExpression = propExp.Body as MemberExpression;
    return memberExpression != null ? memberExpression.Member.Name : null;
}

Использование:

string variableName = NameOf(() => variable);
string propertyName = NameOf((Foo o) => o.Bar);

Обратите внимание, что этот подход заставляет nameof дерево выражений при каждом вызове, поэтому производительность намного хуже по сравнению с nameof оператора, который оценивается во время компиляции и имеет нулевые служебные данные во время выполнения.