Перейти к содержимому

Nameof c что это

  • автор:

Выражение nameof (справочник по C#)

nameof Выражение создает имя переменной, типа или элемента в виде строковой константы. Значение выражения nameof вычисляется во время компиляции, и это не влияет на время выполнения. Если операнд является типом или пространством имен, создаваемое имя не является полным. В следующем примере показано использование nameof выражения:

Console.WriteLine(nameof(System.Collections.Generic)); // output: Generic Console.WriteLine(nameof(List)); // output: List Console.WriteLine(nameof(List.Count)); // output: Count Console.WriteLine(nameof(List.Add)); // output: Add List numbers = [1, 2, 3]; Console.WriteLine(nameof(numbers)); // output: numbers Console.WriteLine(nameof(numbers.Count)); // output: Count Console.WriteLine(nameof(numbers.Add)); // output: Add 

С помощью выражения nameof можно сделать код проверки аргументов более удобным:

public string Name < get =>name; set => name = value ?? throw new ArgumentNullException(nameof(value), $" cannot be null"); > 

Начиная с версии C# 11, вы можете использовать выражение nameof с параметром метода внутри атрибута в методе или его параметре. В следующем коде показано, как это сделать для атрибута метода, локальной функции и параметра лямбда-выражения.

[ParameterString(nameof(msg))] public static void Method(string msg) < [ParameterString(nameof(T))] void LocalFunction(T param) < >var lambdaExpression = ([ParameterString(nameof(aNumber))] int aNumber) => aNumber.ToString(); > 

Выражение nameof с параметром полезно использовать при использовании атрибутов анализа, допускающих значение NULL, или атрибута CallerArgumentExpression.

Если операнд является подробным идентификатором , @ символ не является частью имени, как показано в следующем примере:

var @new = 5; Console.WriteLine(nameof(@new)); // output: new 

Спецификация языка C#

См. также

  • справочник по C#
  • Операторы и выражения C#
  • Преобразование typeof в nameof (правило стиля IDE0082)

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Подскажите аналог nameof, чтобы отобразить не только атрибут, но и его вхождения

В своем приложении я часто использую nameof оператор для работы с базой данных через ORM. К примеру, использую nameof(Employee.Id) и вывожу Id соответственно (конечно, мы можем прописывать атрибут через кавычки, но не всегда удается таким образом отследить изменения объекта). Но появилась необходимость в том, чтобы отобразить не только атрибут, но и вхождения, к примеру, какой-нибудь_оператор(Employee.Job.Country.Id) и появился Job.Country.Id, можете подсказать как это сделать? Условно, я хочу чтобы второй nameof(Test.Count.Id) вернул мне Count.Id

var esqTest = new EntitySchemaQuery(userConnection.EntitySchemaManager, nameof(Test)); esqTest.AddAllSchemaColumns(); esqTest.Filters.Add(esqTest.CreateFilterWithParameters(FilterComparisonType.Equal, nameof(Test), selectedRow)); esqTest.Filters.Add(esqTest.CreateFilterWithParameters(FilterComparisonType.Equal, nameof(Test.Count.Id), 2)); 

введите сюда описание изображения

Отслеживать
Alex Kleshevnikov
задан 29 мая 2020 в 16:29
Alex Kleshevnikov Alex Kleshevnikov
160 9 9 бронзовых знаков

Оператор nameof() возвращает обычную строку типа string . Следовательно и все строковые операции к нему применимы.

29 мая 2020 в 16:48

@aepot я пытался самостоятельно создать какой-нибудь метод, чтобы распарсить путь (getpath(Employee.Job.Country.Id)), но компилятор запрещает делать такие записи, можно конечно сделать типо nameof(Employee) + nameof(Employee.Country) и т. д., но это долго( подумал, что есть более просто способ.

29 мая 2020 в 16:59

Добавьте весь не рабочий код в вопрос, и объясните, как он работает, и как должен. Приведите примеры данных, конкретные, придумайте тестовый пример, простой, можно на базе отдельного пустого проекта. А пока не понятно, чего вы хотите добиться. nameof — это строка-константа, примочка компилятора, никаких динамических операций с этим у вас не получится.

Nameof c что это

Оператор nameof возвращает имя класса, имя метода, имя переменной.

Оператор nameof вычисляется во время компиляции, и не влияет на время выполнения программы.

namespace ConsoleApplication1
<
class Book
<
public void ShowBook( int price)
<
Console .WriteLine( «Hello!» );
>
>

class Program
<
static void Main( string [] args)
<
// имя класса
string str1 = nameof(Book);
// str1 = «Book»
Console .WriteLine(str1);

// имя метода
string str2 = nameof(Book.ShowBook);
// str2 = «ShowBook»
Console .WriteLine(str2);

// имя переменной
int myYear;
string str3 = nameof(myYear);
// str3 = «myYear»
Console .WriteLine(str3);
>
>
>

Где используется nameof
Пример 1 . Чтобы не писать название переменной лучше использовать nameof

public void ShowReport(MyReportType myReportType, long key)
<
if (myReportType == MyReportType.Film)
<
ShowFilmReport(key);
>
else if (myReportType == MyReportType.Book)
<
ShowCarReport(key);
>
else
<
throw new InvalidOperationException(nameof(myReportType) + » is undefined» ));
>
>

Пример 2 . Чтобы не писать название метода в controller лучше использовать nameof
[HttpPost]
[ActionName(nameof(Add))]
public virtual async Task AddBook(BookViewModel viewModel)
<
.
>

← Previous topic
Аттрибут [Remote(«IsValidAuthor», «Home», ErrorMessage = «Enter correct author of book»)] описывается для свойства в C# классе и проверяет это свойство на правильность на сервере через метод IsValidAuthor в conroller Home, если метод возвращает false, то на экране будет ошибка ErrorMessage в ASP.NET MVC

Оператор nameof C#

В C# оператор nameof используется для получения имени символа в виде строки.

Когда мы используем оператор nameof(Name) , мы получаем строку «Name» .

Если мы используем OnPropertyChanged(nameof(Name)) , мы передаем «Name» в качестве аргумента методу OnPropertyChanged .

Если мы используем OnPropertyChanged(Name) вместо OnPropertyChanged(nameof(Name)) , мы передаем значение переменной Name в качестве аргумента методу OnPropertyChanged .

Таким образом, в первом случае мы передаем имя свойства в виде строки, а во втором случае мы передаем значение свойства.

Обычно OnPropertyChanged используется для уведомления интерфейса пользователя об изменениях свойства в классе.

Если мы передаем значение свойства вместо его имени, интерфейс пользователя не сможет обновиться правильно, так как он не знает, какое свойство было изменено.

Таким образом, использование OnPropertyChanged(nameof(Name)) является более правильным и предпочтительным, так как мы передаем имя свойства в качестве строки, что позволяет интерфейсу пользователя правильно обновляться.

В чем разница OnPropertyChanged(nameof(Name)) и OnPropertyChanged(«Name»)

Обе записи OnPropertyChanged(nameof(Name)) и OnPropertyChanged(«Name») приводят к вызову одного и того же метода OnPropertyChanged с аргументом в виде строки «Name» . Однако, существуют некоторые отличия между этими двумя подходами.

Разница между ними заключается в том, что nameof(Name) проверяет наличие свойства Name на этапе компиляции, тогда как «Name» является строковым литералом, который проверяется только на этапе выполнения. Это означает, что если мы используем OnPropertyChanged(«Name») , и в классе нет свойства с именем «Name» , то мы получим ошибку только на этапе выполнения. Если же мы используем OnPropertyChanged(nameof(Name)) и свойство Name не существует, мы получим ошибку на этапе компиляции.

Еще одним преимуществом использования nameof является то, что оно облегчает рефакторинг кода. Если мы переименуем свойство Name в FullName , то все места, где используется OnPropertyChanged(nameof(Name)) , автоматически будут обновлены на OnPropertyChanged(nameof(FullName)) , что позволяет избежать ошибок, связанных с переименованием свойств.

Таким образом, использование OnPropertyChanged(nameof(Name)) является более безопасным и предпочтительным подходом, так как позволяет проверять наличие свойств на этапе компиляции, облегчает рефакторинг кода и снижает вероятность ошибок во время выполнения.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *