C#中nameof的實現(xiàn)實例
在 C# 中,nameof 是一個上下文關(guān)鍵字(contextual keyword),用于在編譯時獲取 變量、類型或成員的名稱,并以字符串形式返回。它的主要作用是避免硬編碼字符串,提高代碼的可維護性和健壯性,尤其是在需要引用標識符名稱的場景中(如異常處理、日志記錄、數(shù)據(jù)綁定等)。
基本用法
nameof 可以用于以下場景:
獲取變量名
string myVariable = "Hello"; string variableName = nameof(myVariable); // 返回 "myVariable"
獲取屬性名
public class MyClass { public string MyProperty { get; set; } } MyClass obj = new MyClass(); string propertyName = nameof(obj.MyProperty); // 返回 "MyProperty"獲取類型名
string typeName = nameof(MyClass); // 返回 "MyClass"
獲取方法名
public void MyMethod() { string methodName = nameof(MyMethod); // 返回 "MyMethod" }獲取命名空間或泛型類型的部分名稱
Console.WriteLine(nameof(System.Collections.Generic)); // 輸出 "Generic" Console.WriteLine(nameof(List<int>)); // 輸出 "List" Console.WriteLine(nameof(List<int>.Count)); // 輸出 "Count"
典型應(yīng)用場景
1.異常處理
在參數(shù)校驗時,使用 nameof 可以明確指出問題所在的參數(shù)或?qū)傩裕?/p>
public string UserName
{
get => _userName;
set
{
if (string.IsNullOrEmpty(value))
{
throw new ArgumentException("Name cannot be null or empty.", nameof(UserName));
}
_userName = value;
}
}- 如果
UserName被設(shè)置為空,拋出的異常會明確顯示"UserName"作為參數(shù)名。
2.日志記錄
在日志中記錄代碼元素的名稱,避免硬編碼字符串:
Console.WriteLine($"Initializing {nameof(Color)} enum"); // 輸出 "Initializing Color"3.數(shù)據(jù)綁定與模型驗證
在 MVC 或數(shù)據(jù)綁定框架中,結(jié)合 nameof 生成驗證消息:
public class UserModel
{
[Required(ErrorMessage = $"The {nameof(UserName)} field is required.")]
public string UserName { get; set; }
}- 如果
UserName被重命名,nameof會自動更新,避免字符串錯誤。
4.單元測試
在測試中明確標識測試的目標方法或?qū)傩裕?/p>
[TestMethod]
public void TestUserNameProperty()
{
var service = new UserService();
Assert.ThrowsException<ArgumentException>(() => service.UserName = "",
$"Setting {nameof(UserService.UserName)} to empty should throw.");
}與ToString()的區(qū)別
| 特性 | nameof | ToString() |
|---|---|---|
| 執(zhí)行時機 | 編譯時(生成字符串常量) | 運行時(調(diào)用方法) |
| 返回內(nèi)容 | 標識符的名稱(如變量、屬性名) | 對象的字符串表示(如值或自定義格式) |
| 示例 | nameof(myVariable) → "myVariable" | myVariable.ToString() → "Hello" |
枚舉的對比
enum Color { Red, Green, Blue }
Color myColor = Color.Green;
string a = nameof(myColor); // 返回 "myColor"(變量名)
string b = nameof(Color.Blue); // 返回 "Blue"(枚舉成員名)
string c = myColor.ToString(); // 返回 "Green"(枚舉值的名稱)注意事項
編譯時操作nameof 在編譯時求值,因此不會引入運行時開銷。
不支持局部變量
不能用于局部變量(如方法內(nèi)部定義的變量):
void MyMethod()
{
int x = 10;
string name = nameof(x); // ? 錯誤:x 是局部變量
}忽略 @ 符號
如果標識符以 @ 開頭(如 @class),@ 會被忽略:
var @new = 5; Console.WriteLine(nameof(@new)); // 輸出 "new"
泛型類型的限制nameof(T) 返回的是泛型參數(shù)名(如 "T"),而非實際類型名。若需要實際類型名,需結(jié)合反射:
public void GenericMethod<T>()
{
string typeName = nameof(T); // 返回 "T"
// 使用反射獲取實際類型名:
Type actualType = typeof(T);
string actualTypeName = actualType.Name; // 如 "String"
}C# 11 的新特性
從 C# 11 開始,nameof 可用于 方法參數(shù) 和 屬性:
[ParameterString(nameof(msg))]
public static void Method(string msg)
{
[ParameterString(nameof(T))]
void LocalFunction<T>(T param) { }
var lambda = ([ParameterString(nameof(aNumber))] int aNumber) => aNumber.ToString();
}總結(jié)
nameof 是 C# 中非常實用的工具,尤其在需要引用標識符名稱的場景中(如異常處理、日志記錄、數(shù)據(jù)綁定)。它的核心優(yōu)勢包括:
- 避免硬編碼字符串,減少錯誤。
- 編譯時檢查,確保代碼健壯性。
- 提高可讀性和可維護性,特別是在重構(gòu)時自動更新名稱。
通過合理使用 nameof,可以編寫出更清晰、更可靠的代碼。
到此這篇關(guān)于C#中nameof的實現(xiàn)實例的文章就介紹到這了,更多相關(guān)C# nameof內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#操作NPOI實現(xiàn)Excel數(shù)據(jù)導(dǎo)入導(dǎo)出
這篇文章主要為大家詳細介紹了C#如何操作NPOI實現(xiàn)Excel數(shù)據(jù)導(dǎo)入導(dǎo)出功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-02-02
c# socket網(wǎng)絡(luò)編程接收發(fā)送數(shù)據(jù)示例代碼
這篇文章主要介紹了c# socket網(wǎng)絡(luò)編程,server端接收,client端發(fā)送數(shù)據(jù),大家參考使用吧2013-12-12
C#實現(xiàn)漢字轉(zhuǎn)拼音(多音字)功能詳解
這篇文章主要為大家詳細介紹了如何利用C#實現(xiàn)漢字轉(zhuǎn)拼音(支持多音字)的功能,文中的示例代碼講解詳細,對我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2023-02-02

