這是一個很好的結構候選人嗎?結構與字符串成員?無效的默認實例可接受?
考慮這樣的構造驗證輸入並存儲驗證的數據作爲一個單一的「路由代碼」這個永恆不變的結構例子:
struct RoutingCode
{
private readonly string routingCode;
RoutingCode(string prefix, string service, string sender)
{
// Validate prefix, service, sender strings
// ...
if (isInvalid) throw ArgumentException();
//
this.routingCode = prefix + service + sender;
}
// Gets the validated routing code.
public string Routing
{
return this.routingCode;
}
public int RoutingLength
{
return this.routingCode.Length;
}
}
這個簡單的例子,在我看來是使用struct
,而不是一個很好的候選的一個class
:
- 它是不可變的。
- 它代表一個奇異值。
- 實例大小很小。
問題是所有的結構都有一個隱含的默認構造函數。在此示例中,默認構造函數RoutingCode()
將實例化一個對象,其中Routing
屬性返回null
—這是一個無效的路由代碼。這與其他結構不同,例如Point
或BigInteger
,其中支持字段對於默認實例包含非常合理且有效的「零」。
除了不確保有效的路由代碼,RoutingLength
屬性拋出一個NullReferenceException
如果在默認實例上調用。
保持這個struct
與使它成爲class
有什麼參數?
我看到http://stackoverflow.com/q/13386719/733805基本上是重複的,接受的答案是使用'class'的好例子。所有的輸入是讚賞。 – 2013-03-18 04:18:02
然而我同意你對重複使用案例的看法。然而,我並不完全同意這個結論,因爲你的用例對結構來說非常有用。最後,你必須權衡利弊... – bigge 2013-03-18 04:26:29
@ bigge謝謝。我認爲「一個有效的默認實例」反對我最初使用struct的願望。由於'string'是一個引用類型,因此這裏的結構在效率方面並沒有太大的作用。 – 2013-03-18 04:38:16