我需要爲結構使用空值。.Net 1.x中結構的空/空值
我不知道哪個是最好的選擇。我正在考慮在結構上使用靜態只讀字段,但我不確定這是否是最好的選擇。也許一個普通類的方法返回空,是一個更好的選擇。
我使用結構的性能原因,所以更改它到一個類是不是一個選項。而且我不確定是否使用靜態字段,每個結構實例的大小都會增加。
任何想法?
我需要爲結構使用空值。.Net 1.x中結構的空/空值
我不知道哪個是最好的選擇。我正在考慮在結構上使用靜態只讀字段,但我不確定這是否是最好的選擇。也許一個普通類的方法返回空,是一個更好的選擇。
我使用結構的性能原因,所以更改它到一個類是不是一個選項。而且我不確定是否使用靜態字段,每個結構實例的大小都會增加。
任何想法?
是否有結構的任何值,自然會失效?特別是,你可以隨時寫:
MyStruct x = new MyStruct();
這將結束所有的位爲0。如果這不是你的結構由於某種原因,一個有效的狀態(例如你有一個整數值在構造函數中總是被設置爲非零)那麼這很好 - 用它作爲你的「空」值。你可以創建一個靜態字段,如果你想要的值:
public static readonly MyStruct Empty = new MyStruct();
注意添加靜態字段的任何開銷不會增加情況下你的結構的。
但是,如果結構中的每個可能的位模式都已經是一個有效值,那麼您需要一種不同的方法 - 在結構中添加一個額外的字段,或者向任何使用的代碼添加額外的字段你的結構,可能需要代表一個「缺失」值。
你說使用類不是「出於性能原因」的選項 - 這是因爲你已經對你的情況進行了嚴格的基準測試嗎?
.net框架中的常見習語是具有名爲「Empty」的靜態只讀字段,如Size.Empty
。
我喜歡CodyManix的觀點。這是我寫的:
public struct ConfCode
{
public String Agency;
public String CodeText;
public String ToolTip;
public Boolean IsActive;
public Boolean IsDefault;
public Boolean IsEmpty()
{
if (Agency == null & CodeText == null & ToolTip == null)
{ return true; }
else
{ return false; }
}
}
我知道這是一個相當遲的答覆,但它的價值在這裏是我的實現。
bool
財產稱爲isEmpty
bool
說法,把它分配給isEmpty
Empty
這返回您的對象的實例,並調用通過一個true
參數的私有構造函數==
和!=
檢查isEmpty
是兩個比方說,我有一個名爲ExampleClass
類:
public class Example
{
public string Message;
private bool isEmpty;
public Example(string Message)
{
this.Message = Message;
isEmpty = false;
}
}
稱爲isEmpty
的bool
財產已被定義,以及作爲字符串屬性和分配給字符串的基本構造函數。
還需要定義一個私有構造函數,該構造函數接受一個布爾參數並將其分配給isEmpty
。
private Example(bool isEmpty)
{
this.isEmpty = isEmpty;
}
然後,您將需要定義一個靜態的吸氣劑,在這個例子中,通過調用私有的構造和分配isEmpty
爲true返回Example
一個新的實例。
public static Example Empty
{
get
{
return new Example(isEmpty: true);
}
}
一旦你這樣做了,你需要重載兩個操作符。等於和不等於。如果您不會重載這兩個操作符,則當您嘗試檢查實例是否等於Example.Empty
時可能會出錯。
public static bool operator ==(Example eg1, Example eg2)
{
if (eg1.isEmpty == true && eg2.isEmpty == true) return true;
else return Example.Equals(eg1, eg2);
}
public static bool operator !=(Example eg1, eg2)
{
if (eg1.isEmpty != eg2.isEmpty) return true;
else return !Example.Equals(eg1,eg2);
}
你確定你應該使用一個結構嗎?你有沒有測量? – SLaks 2011-01-27 17:30:01
是的,我使用日誌和分析器也是這樣做的。 – Borja 2011-01-27 17:34:17