В версии 6.0 появилась новая функция nameof
, но я не могу понять ее назначение, поскольку она просто берет имя переменной и заменяет ее на строку при компиляции.
Я думал, что это может иметь какую-то цель при использовании, <T>
но когда я пытаюсь, nameof(T)
он просто печатает меня T
вместо используемого типа.
Любая идея о цели?
T
раньше. Был способ получить использованный тип раньше.nameof
. Также помогает предотвратить опечатки.[Test, TestCaseSource(typeof(MyDataClass), "TestCases")]
, которую можно заменить на[Test, TestCaseSource(typeof(MyDataClass), nameof(MyDataClass.TestCases))]
. Гораздо приятнее.Ответы:
Как насчет случаев, когда вы хотите повторно использовать имя свойства, например, при создании исключения на основе имени свойства или при обработке
PropertyChanged
события. Есть множество случаев, когда вы хотели бы иметь имя собственности.Возьмите этот пример:
В первом случае переименование
SomeProperty
также изменит имя свойства или прервет компиляцию. В последнем случае нет.Это очень полезный способ сохранить ваш код компиляцией и без ошибок (вроде как).
( Очень хорошая статья от Эрика Липперта, почему
infoof
не удалось, аnameof
сделал)источник
nameof
имени действия вместо жестко заданной строки.public class MyController { public ActionResult Index() { return View(nameof(Index)); } }
- и вы можете использоватьnameof
на нестатических членах (например, вы можете вызывать,nameof(MyController.Index)
используя класс выше, и он выдаст «Index»). Ознакомьтесь с примерами по адресу msdn.microsoft.com/en-us/library/…Это действительно полезно для
ArgumentException
и его производных:Теперь, если кто-то изменит имя
input
параметра, исключение также будет обновляться.Это также полезно в некоторых местах, где ранее было необходимо использовать отражение, чтобы получить имена свойств или параметров.
В вашем примере
nameof(T)
получается имя параметра типа - это тоже может быть полезно:Другое использование
nameof
для перечислений - обычно, если вы хотите использовать строковое имя перечисления.ToString()
:Это на самом деле относительно медленно, так как .Net хранит значение перечисления (т.е.
7
) и находит имя во время выполнения.Вместо этого используйте
nameof
:Теперь .Net заменяет имя перечисления на строку во время компиляции.
Еще одно использование предназначено для подобных вещей
INotifyPropertyChanged
и ведения журнала - в обоих случаях вы хотите, чтобы имя вызываемого вами члена было передано другому методу:Или...
источник
typeof(T)
, который является еще одним кусочком сахара во время компиляции, который полезен в подобных обстоятельствах :-)nameofthismethod
. Вы можете использовать,Log.Error($"Error in {nameof(DoSomething)}...")
но если вы скопируете это в другие методы, вы не заметите, что оно все еще ссылается наDoSomething
. Поэтому, хотя он отлично работает с локальными переменными или параметрами, имя метода является проблемой.nameOf
будете использовать[DisplayName]
атрибут, если он присутствует? Дляenum
примера, который я[DisplayName]
часто использую с проектами MVCthrow new
это совершенно другой анти-паттерн - я считаю, что чрезмерное использованиеcatch
является распространенной проблемой для младших разработчиков, потому что это похоже на исправление проблемы (когда большую часть времени она просто скрывает это).Еще один вариант использования, в котором
nameof
функция C # 6.0 становится удобной - рассмотрим такую библиотеку, как Dapper, которая значительно упрощает поиск в БД. Хотя это отличная библиотека, вам нужно жестко задавать имена свойств / полей в запросе. Это означает, что если вы решите переименовать свое свойство / поле, есть большие шансы, что вы забудете обновить запрос, чтобы использовать новые имена полей. Благодаря интерполяции строк иnameof
функциям код становится намного проще в обслуживании и в безопасности типов.Из примера, приведенного в ссылке
без имени
с именем
источник
Ваш вопрос уже выражает цель. Вы должны увидеть, что это может быть полезно для регистрации или создания исключений.
например.
это хорошо, если я изменю имя переменной, вместо этого код сломается или выдаст исключение с неверным сообщением .
Конечно, использование не ограничено этой простой ситуацией. Вы можете использовать
nameof
всякий раз, когда было бы полезно кодировать имя переменной или свойства.Использование разнообразно, когда вы рассматриваете различные ситуации связывания и отражения. Это отличный способ перенести ошибки компиляции во время выполнения.
источник
OnPropertyChanged
методов (которые непосредственно принимают имена свойств, а неPropertyChangedEventArgs
), или обращений к отражению для поиска конкретного член или тип?Наиболее распространенный вариант использования, о котором я могу подумать, - это работа с
INotifyPropertyChanged
интерфейсом. (В основном все, что связано с WPF и привязками, использует этот интерфейс)Посмотрите на этот пример:
Как вы можете видеть по-старому, мы должны передать строку, чтобы указать, какое свойство изменилось. С помощью
nameof
мы можем использовать имя собственности напрямую. Это не может показаться большим делом. Но представьте, что происходит, когда кто-то меняет название объектаFoo
. При использовании строки привязка перестанет работать, но компилятор не предупредит вас. При использовании nameof вы получаете ошибку компилятора, что нет имени / аргумента с именемFoo
.Обратите внимание, что некоторые фреймворки используют магию отражения, чтобы получить имя свойства, но теперь у нас есть nameof, которое больше не нужно .
источник
[CallerMemberName]
атрибута в параметре нового метода для вызова этого события.[CallerMemberName]string x = null
лучше, чемnameof(Property)
. Можно сказать, что имя свойства используется дважды, но это в основном аргумент, передаваемый функции. Не совсем то, что подразумевается под DRY, я думаю :).nameof
заключается в том, что установщику свойств вообще не нужно указывать имя свойства, что исключает возможность копирования / вставки ошибок.INotifyPropertyChanged
, так как использование команды[CallerMemberNameAttribute]
позволяет аккуратно вызывать уведомление об изменении из установщика свойств, аnameof
синтаксис позволяет аккуратно вызывать уведомление об изменении из другого места в вашем коде.Наиболее распространенное использование будет при проверке ввода, таких как
В первом случае, если вы реорганизуете метод, изменяя имя параметра par , вы, вероятно, забудете изменить это в ArgumentNullException . С именем вам не нужно беспокоиться об этом.
Смотрите также: nameof (C # и Visual Basic Reference)
источник
Проект ASP.NET Core MVC использует
nameof
вAccountController.cs
иManageController.cs
сRedirectToAction
методом ссылку на действие в контроллере.Пример:
Это переводится как:
и берет берет пользователя к действию «индекс» в контроллере «Home», то есть
/Home/Index
.источник
return RedirectToAction(nameof(HomeController.Index), nameof(HomeController).Substring(nameof(HomeController),0,nameof(HomeController).Length-"Controller".Length));
?Как уже отмечали другие,
nameof
оператор вставляет имя, которое элемент был задан в исходном коде.Я хотел бы добавить, что это действительно хорошая идея с точки зрения рефакторинга, так как это делает рефакторинг этой строки безопасным. Ранее я использовал статический метод, который использовал отражение для той же цели, но это влияет на производительность во время выполнения.
nameof
Оператор не имеет никакого влияния на производительность во время выполнения; он выполняет свою работу во время компиляции. Если вы посмотрите наMSIL
код, вы найдете встроенную строку. Смотрите следующий метод и его разобранный код.Однако это может быть недостатком, если вы планируете запутать свое программное обеспечение. После запутывания внедренная строка может больше не соответствовать названию элемента. Механизмы, которые полагаются на этот текст, сломаются. Примеры для этого, включая, но не ограничиваясь: Reflection, NotifyPropertyChanged ...
Определение имени во время выполнения требует некоторой производительности, но является безопасным для запутывания. Если запутывание не требуется и не планируется, я бы порекомендовал использовать
nameof
оператора.источник
Учтите, что вы используете переменную в своем коде, вам нужно получить имя переменной и, скажем, напечатать ее, вам нужно использовать
И если затем кто-то реорганизует код и использует другое имя для «myVar», ему / ей придется следить за строковым значением в вашем коде и соответствующим образом изменять его.
Вместо этого, если у вас было
Это поможет рефакторинг автоматически!
источник
Type
и и значение. Это позволило бы коду, вызывающему методы ведения журналов, устранить большую избыточность.В статье MSDN перечислены маршрутизация MVC (пример, который действительно выбрал для меня эту концепцию) среди нескольких других. (Отформатированный) параграф описания гласит:
Принятые / получившие наибольшее количество ответов уже дают несколько отличных конкретных примеров.
источник
Цель
nameof
оператора - указать имя источника артефактов.Обычно имя источника совпадает с именем метаданных:
Но это не всегда так:
Или:
Я использовал его для именования ресурсов:
Дело в том, что в этом случае мне даже не нужны были сгенерированные свойства для доступа к ресурсам, но теперь у меня есть проверка во время компиляции, что ресурсы существуют.
источник
Одно из
nameof
ключевых слов - для настройкиBinding
в wpf программно .чтобы установить,
Binding
вы должны установитьPath
со строкой и сnameof
ключевым словом, можно использовать опцию Refactor.Например, если у вас есть
IsEnable
свойство зависимостиUserControl
и вы хотите связать его сIsEnable
некоторыми изCheckBox
васUserControl
, вы можете использовать эти два кода:и
Очевидно, что первый код не может быть реорганизован, но второй ...
источник
Ранее мы использовали что-то вроде этого:
Причина - компилировать безопасность времени. Никто не может молча переименовать свойство и нарушить логику кода. Теперь мы можем использовать nameof ().
источник
Это имеет преимущество при использовании ASP.Net MVC. Когда вы используете HTML-помощник для создания некоторого элемента управления, он использует имена свойств в атрибуте name ввода html:
Это делает что-то вроде этого:
Итак, теперь, если вам нужно проверить свойство в методе Validate, вы можете сделать это:
Если вы переименуете свою собственность с помощью инструментов рефакторинга, ваша проверка не будет нарушена.
источник
Другим вариантом использования
nameof
является проверка вкладок, вместо проверки индекса вы можете проверитьName
свойства вкладок следующим образом:Менее грязный :)
источник
Я считаю, что это
nameof
повышает читаемость очень длинных и сложных операторов SQL в моих приложениях. Это выделяет переменные из этого множества строк и избавляет вас от необходимости выяснять, где переменные используются в ваших операторах SQL.источник