Я часто хочу это сделать:
public void Foo(Bar arg)
{
throw new ArgumentException("Argument is incompatible with " + name(Foo));
}
Потому что, если я изменю имя Foo, среда IDE также будет реорганизовывать мое сообщение об ошибке, что не произойдет, если я поместил имя метода (или любого другого типа <элемент > участника) внутри строковый литерал. Единственный способ, которым я знаю реализацию "имени", - использовать рефлексию, но я думаю, что потеря производительности перевешивает коэффициент полезного действия и не будет охватывать все типы идентификаторов.
Значение выражения между скобками может быть вычислено во время компиляции (например, typeof) и оптимизировано для того, чтобы стать одним строковым литералом, изменив спецификацию языка. Считаете ли вы, что это достойная функция?
PS: В первом примере это выглядело так, что вопрос связан только с исключениями, но это не так. Подумайте о каждой ситуации, которую вы можете захотеть ссылаться на идентификатор элемента . Вам нужно будет сделать это через строковый литерал, верно?
Другой пример:
[RuntimeAcessibleDocumentation(Description="The class " + name(Baz) +
" does its job. See method " + name(DoItsJob) + " for more info.")]
public class Baz
{
[RuntimeAcessibleDocumentation(Description="This method will just pretend " +
"doing its job if the argument " + name(DoItsJob.Arguments.justPretend) +
" is true.")]
public void DoItsJob(bool justPretend)
{
if (justPretend)
Logger.log(name(justPretend) + "was true. Nothing done.");
}
}
ОБНОВЛЕНИЕ: этот вопрос был отправлен до С# 6, но может по-прежнему иметь значение для тех, кто использует предыдущие версии языка. Если вы используете С# 6, обратитесь к оператору nameof
, который в приведенных выше примерах выполняет почти то же самое, что и оператор name
.