有過正確實現結構經驗的所有 .net 開發人員無疑都為乙個問題所困擾:需要使用多少語法才能使型別固定不變(為 .net 標準建議的型別)。此問題實際上是唯讀屬性存在的問題:
定義為唯讀的支援字段
建構函式內支援欄位的初始化
屬性的顯式實現(而非使用自動屬性)
返回支援欄位的顯式 getter 實現
所有這一切僅僅是為了「正確地」實現固定不變的屬性。之後,此情況還會針對型別的所有屬性重**生。因此,正確操作需要比不堪一擊的方法付出明顯更多的努力。發布了自動屬性初始化表示式(ctp3 還包括對初始化表示式的支援)這個新功能後,c# 6.0 就可派上用場了。自動屬性初始化表示式允許直接在屬性的宣告內分配屬性。對於唯讀屬性,它負責確保屬性固定不變所需的所有繁瑣程式。例如,請看本示例中的 fingerprint 類:
publicclass
fingerprint
=datetime.utcnow;
public
string user =system.security.principal.windowsprincipal.current.identity.name;
public
string process =system.diagnostics.process.getcurrentprocess().processname;
}
如**所示,屬性初始化表示式允許向屬性分配乙個初始值作為屬性宣告的一部分。屬性可以是唯讀的(只包含 getter),也可以是讀/寫(包含 setter 和 getter)的。如果是唯讀的,則基礎支援欄位將通過唯讀修飾符自動宣告。這就確保了在初始化之後會固定不變。
初始化表示式可以是任意表示式。例如,通過使用條件運算子,您可以設定預設初始化值:
publicstring config = string
.isnullorwhitespace(
string connectionstring =(
string)properties.settings.default.context?["
connectionstring
"])?connectionstring :
"";
本示例中,請注意之前的文章中所討論的如何使用宣告表示式(請參閱 itl.tc/?p=4040)。如果您需要的不只是表示式,可以將初始化重構到靜態方法中,然後對其進行呼叫。
ctp3 版本中介紹的另乙個新增功能是支援 nameof 表示式。您將多次需要在**中使用「魔幻字串」。此類「魔幻字串」是對映到您**中的程式元素的普通 c# 字串。例如,引發 argumentnullexception 時,使用乙個字串表示無效對應引數的名稱。遺憾的是,這些魔幻字串未經過編譯時驗證,任意程式元素更改(例如,重新命名引數)都不會自動更新魔幻字串,從而導致不一致,而編譯器根本不會發現此問題。
在其他情況下,例如引發 onpropertychanged 事件時,可以通過提取名稱的樹表示式技術避免出現魔幻字串。鑑於操作簡單(只識別程式元素名稱),所以這或許有點讓人頭疼。無論哪種情況,解決方案都不太理想。
若要解決這一特性,c# 6.0 提供了對「程式元素」名稱的訪問許可權,無論是類名稱、方法名稱、引數名稱還是特定屬性名稱(可能是對於使用反射的情況)。例如,圖 2中的**使用 nameof 表示式提取引數的名稱。
//使用 nameof 表示式提取引數名稱
void throwargumentnullexceptionusingnameof(string
param1)
[testmethod]
public
void
nameof_usingnameofexpressioninargumentnullexception()
catch
(argumentnullexception exception)
正如測試方法所演示的,argumentnullexception 的 paramname 屬性具有 param1 值,這是使用方法中的 nameof(param1) 表示式的值集。nameof 表示式不僅僅用於引數,您還可以使用它來檢索所有程式設計元素。
//檢索其他程式設計元素
namespace
csharp6.tests
", nameof(nameof_extractsname)));
assert.areequal
("nameof_extractsname",
string.format("
", nameof(
csharp6.tests.nameoftests.nameof_extractsname)));
}}}
nameof 表示式僅檢索最終的識別符號,即使您使用更多的顯式包含點的名稱也是如此。此外,對於屬性而言,未隱含「attribute」字尾。相反,編譯需要它。它非常適合用於清理混亂**。
原文出處:
c 6 0新特性(一)
接近年底了,基本上沒什麼活了,就學點新東西,就想著了解下c 6.0的新特性。在code project上看到了一篇不錯的文章,就準備翻譯一下,順便照著學習學習。廢話不多說,直奔主題。眾所周知,c 6.0 是在visual studio 2015中引入的。在其他的幾個版本中同樣引入一些特性,比如在c ...
c 6 0新特性(一)
接近年底了,基本上沒什麼活了,就學點新東西,就想著了解下c 6.0的新特性。在code project上看到了一篇不錯的文章,就準備翻譯一下,順便照著學習學習。廢話不多說,直奔主題。眾所周知,c 6.0 是在visual studio 2015中引入的。在其他的幾個版本中同樣引入一些特性,比如在c ...
C 6 0新加特性
1 自動屬性的增強 1.1 自動屬性初始化 initializers for auto properties c 4.0下的果斷實現不了的。c 6.0中自動屬性的初始化方式 只要接觸過c 的肯定都會喜歡這種方式。真是簡潔方便呀。1.2 唯讀屬性初始化getter only auto properti...