C#中nameof用法和應(yīng)用場(chǎng)景實(shí)現(xiàn)
在 C# 中,nameof 是一個(gè)上下文關(guān)鍵字(contextual keyword),用于在編譯時(shí)獲取 變量、類(lèi)型或成員的名稱,并以字符串形式返回。它的主要作用是避免硬編碼字符串,提高代碼的可維護(hù)性和健壯性,尤其是在需要引用標(biāo)識(shí)符名稱的場(chǎng)景中(如異常處理、日志記錄、數(shù)據(jù)綁定等)。
基本用法
nameof 可以用于以下場(chǎng)景:
獲取變量名
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"獲取類(lèi)型名
string typeName = nameof(MyClass); // 返回 "MyClass"
獲取方法名
public void MyMethod() { string methodName = nameof(MyMethod); // 返回 "MyMethod" }獲取命名空間或泛型類(lèi)型的部分名稱
Console.WriteLine(nameof(System.Collections.Generic)); // 輸出 "Generic" Console.WriteLine(nameof(List<int>)); // 輸出 "List" Console.WriteLine(nameof(List<int>.Count)); // 輸出 "Count"
典型應(yīng)用場(chǎng)景
1.異常處理
在參數(shù)校驗(yàn)時(shí),使用 nameof 可以明確指出問(wèn)題所在的參數(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è)置為空,拋出的異常會(huì)明確顯示"UserName"作為參數(shù)名。
2.日志記錄
在日志中記錄代碼元素的名稱,避免硬編碼字符串:
Console.WriteLine($"Initializing {nameof(Color)} enum"); // 輸出 "Initializing Color"3.數(shù)據(jù)綁定與模型驗(yàn)證
在 MVC 或數(shù)據(jù)綁定框架中,結(jié)合 nameof 生成驗(yàn)證消息:
public class UserModel
{
[Required(ErrorMessage = $"The {nameof(UserName)} field is required.")]
public string UserName { get; set; }
}- 如果
UserName被重命名,nameof會(huì)自動(dòng)更新,避免字符串錯(cuò)誤。
4.單元測(cè)試
在測(cè)試中明確標(biāo)識(shí)測(cè)試的目標(biāo)方法或?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í)行時(shí)機(jī) | 編譯時(shí)(生成字符串常量) | 運(yùn)行時(shí)(調(diào)用方法) |
| 返回內(nèi)容 | 標(biāo)識(shí)符的名稱(如變量、屬性名) | 對(duì)象的字符串表示(如值或自定義格式) |
| 示例 | nameof(myVariable) → "myVariable" | myVariable.ToString() → "Hello" |
枚舉的對(duì)比
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"(枚舉值的名稱)注意事項(xiàng)
編譯時(shí)操作nameof 在編譯時(shí)求值,因此不會(huì)引入運(yùn)行時(shí)開(kāi)銷(xiāo)。
不支持局部變量
不能用于局部變量(如方法內(nèi)部定義的變量):
void MyMethod()
{
int x = 10;
string name = nameof(x); // ? 錯(cuò)誤:x 是局部變量
}忽略 @ 符號(hào)
如果標(biāo)識(shí)符以 @ 開(kāi)頭(如 @class),@ 會(huì)被忽略:
var @new = 5; Console.WriteLine(nameof(@new)); // 輸出 "new"
泛型類(lèi)型的限制nameof(T) 返回的是泛型參數(shù)名(如 "T"),而非實(shí)際類(lèi)型名。若需要實(shí)際類(lèi)型名,需結(jié)合反射:
public void GenericMethod<T>()
{
string typeName = nameof(T); // 返回 "T"
// 使用反射獲取實(shí)際類(lèi)型名:
Type actualType = typeof(T);
string actualTypeName = actualType.Name; // 如 "String"
}C# 11 的新特性
從 C# 11 開(kāi)始,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í)用的工具,尤其在需要引用標(biāo)識(shí)符名稱的場(chǎng)景中(如異常處理、日志記錄、數(shù)據(jù)綁定)。它的核心優(yōu)勢(shì)包括:
- 避免硬編碼字符串,減少錯(cuò)誤。
- 編譯時(shí)檢查,確保代碼健壯性。
- 提高可讀性和可維護(hù)性,特別是在重構(gòu)時(shí)自動(dòng)更新名稱。
通過(guò)合理使用 nameof,可以編寫(xiě)出更清晰、更可靠的代碼。
到此這篇關(guān)于C#中nameof用法和應(yīng)用場(chǎng)景實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C# nameof用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#程序員應(yīng)該養(yǎng)成的程序性能優(yōu)化寫(xiě)法
工作和生活中經(jīng)常可以看到一些程序猿,寫(xiě)代碼的時(shí)候只關(guān)注代碼的邏輯性,而不考慮運(yùn)行效率,其實(shí)這對(duì)大多數(shù)程序猿來(lái)說(shuō)都是沒(méi)有問(wèn)題的,不過(guò)作為一只有理想的CodeMonkey,我還是希望給大家分享一些性能優(yōu)化心得2017-08-08
Unity Shader實(shí)現(xiàn)2D游戲迷霧
這篇文章主要為大家詳細(xì)介紹了Unity Shader實(shí)現(xiàn)2D游戲迷霧,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
C#實(shí)現(xiàn)的ZPL條碼打印類(lèi)完整實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)的ZPL條碼打印類(lèi),結(jié)合實(shí)例形式詳細(xì)分析了C#實(shí)現(xiàn)條碼打印的原理與使用方法,代碼注釋中備有詳盡的說(shuō)明,便于理解使用,需要的朋友可以參考下2016-06-06
Unity?百度AI實(shí)現(xiàn)Logo商標(biāo)識(shí)別
本文主要介紹了Unity實(shí)現(xiàn)檢測(cè)和識(shí)別圖片中的品牌LOGO信息。即對(duì)于輸入的一張圖片(可正常解碼,且長(zhǎng)寬比適宜),輸出圖片中LOGO的名稱、位置和置信度。需要的可以參考一下2022-01-01
unity實(shí)現(xiàn)車(chē)方向盤(pán)轉(zhuǎn)動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了unity實(shí)現(xiàn)車(chē)方向盤(pán)轉(zhuǎn)動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
C#調(diào)用OpenCV開(kāi)發(fā)簡(jiǎn)易版美圖工具【推薦】
本文主要介紹在WPF項(xiàng)目中使用OpenCVSharp3-AnyCPU開(kāi)源類(lèi)庫(kù)處理圖片,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-10-10
C# 中的動(dòng)態(tài)創(chuàng)建組件(屬性及事件)的實(shí)現(xiàn)思路及方法
這篇文章主要介紹了C# 中的動(dòng)態(tài)創(chuàng)建組件,有需要的朋友可以參考一下2013-12-12
WPF簡(jiǎn)單的數(shù)據(jù)庫(kù)查詢實(shí)例
下面小編就為大家分享一篇WPF簡(jiǎn)單的數(shù)據(jù)庫(kù)查詢實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-11-11

