6.0版获得了nameof的新功能,但我不能理解它的目的,因为它只是接受变量名并在编译时将其更改为字符串。
我认为它在使用<T>时可能有一些目的,但当我尝试命名(T)时,它只是打印我一个T而不是使用的类型。
知道目的吗?
6.0版获得了nameof的新功能,但我不能理解它的目的,因为它只是接受变量名并在编译时将其更改为字符串。
我认为它在使用<T>时可能有一些目的,但当我尝试命名(T)时,它只是打印我一个T而不是使用的类型。
知道目的吗?
当前回答
假设您需要在代码中打印一个变量的名称。如果你这样写:
int myVar = 10;
print("myVar" + " value is " + myVar.toString());
然后如果有人重构代码并使用另一个名称myVar,他/她将不得不在你的代码中寻找字符串值并相应地更改它。
相反,如果你这样写:
print(nameof(myVar) + " value is " + myVar.toString());
这将有助于自动重构!
其他回答
最常见的用法是在输入验证中,例如
//Currently
void Foo(string par) {
if (par == null) throw new ArgumentNullException("par");
}
//C# 6 nameof
void Foo(string par) {
if (par == null) throw new ArgumentNullException(nameof(par));
}
在第一种情况下,如果你重构了改变par参数名称的方法,你可能会忘记在ArgumentNullException中改变它。有了nameof你就不用担心了。
参见:nameof (c#和Visual Basic参考)
ASP。NET核心MVC项目使用AccountController.cs和ManageController.cs中的name和RedirectToAction方法来引用控制器中的动作。
例子:
return RedirectToAction(nameof(HomeController.Index), "Home");
这句话的意思是:
return RedirectToAction("Index", "Home");
和takes将用户带到'Home'控制器中的'Index'动作,即/Home/Index。
操作符名称的目的是提供工件的源名称。
通常源名称与元数据名称相同:
public void M(string p)
{
if (p == null)
{
throw new ArgumentNullException(nameof(p));
}
...
}
public int P
{
get
{
return p;
}
set
{
p = value;
NotifyPropertyChanged(nameof(P));
}
}
但情况并非总是如此:
using i = System.Int32;
...
Console.WriteLine(nameof(i)); // prints "i"
Or:
public static string Extension<T>(this T t)
{
return nameof(T); returns "T"
}
我给它的一个用途是命名资源:
[Display(
ResourceType = typeof(Resources),
Name = nameof(Resources.Title_Name),
ShortName = nameof(Resources.Title_ShortName),
Description = nameof(Resources.Title_Description),
Prompt = nameof(Resources.Title_Prompt))]
事实上,在这种情况下,我甚至不需要生成的属性来访问资源,但是现在我有一个编译时检查资源是否存在。
它在使用ASP时具有一定的优势。净MVC。当你使用HTML helper在视图中构建一些控件时,它使用HTML输入的name属性中的属性名:
@Html.TextBoxFor(m => m.CanBeRenamed)
它是这样的:
<input type="text" name="CanBeRenamed" />
所以现在,如果你需要在validate方法中验证你的属性,你可以这样做:
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
if (IsNotValid(CanBeRenamed)) {
yield return new ValidationResult(
$"Property {nameof(CanBeRenamed)} is not valid",
new [] { $"{nameof(CanBeRenamed)}" })
}
}
如果你使用重构工具重命名你的属性,你的验证不会被破坏。
nameof的目的是重构。例如,当你在代码中其他地方通过nameof引用一个类的名字时,你会得到一个编译错误,这是你想要的。如果你没有使用nameof,只有一个普通的字符串作为引用,你必须全文搜索类的名称才能更改它。那是一种痛苦。有了nameof,您就可以轻松地在IDE中自动构建和获取所有需要更改的用例。