2011-01-27 35 views
3

我需要爲結構使用空值。.Net 1.x中結構的空/空值

我不知道哪個是最好的選擇。我正在考慮在結構上使用靜態只讀字段,但我不確定這是否是最好的選擇。也許一個普通類的方法返回空,是一個更好的選擇。

我使用結構的性能原因,所以更改它到一個類是不是一個選項。而且我不確定是否使用靜態字段,每個結構實例的大小都會增加。

任何想法?

+1

你確定你應該使用一個結構嗎?你有沒有測量? – SLaks 2011-01-27 17:30:01

+0

是的,我使用日誌和分析器也是這樣做的。 – Borja 2011-01-27 17:34:17

回答

3

是否有結構的任何值,自然會失效?特別是,你可以隨時

MyStruct x = new MyStruct(); 

這將結束所有的位爲0。如果這不是你的結構由於某種原因,一個有效的狀態(例如你有一個整數值在構造函數中總是被設置爲非零)那麼這很好 - 用它作爲你的「空」值。你可以創建一個靜態字段,如果你想要的值:

public static readonly MyStruct Empty = new MyStruct(); 

注意添加靜態字段的任何開銷不會增加情況下你的結構的

但是,如果結構中的每個可能的位模式都已經是一個有效值,那麼您需要一種不同的方法 - 在結構中添加一個額外的字段,或者向任何使用的代碼添加額外的字段你的結構,可能需要代表一個「缺失」值。

你說使用類不是「出於性能原因」的選項 - 這是因爲你已經對你的情況進行了嚴格的基準測試嗎?

2

.net框架中的常見習語是具有名爲「Empty」的靜態只讀字段,如Size.Empty

0

我喜歡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; } 
     } 
    } 
1

我知道這是一個相當遲的答覆,但它的價值在這裏是我的實現。

您將有:

  1. 創建一個私有bool財產稱爲isEmpty
  2. 創建一個bool說法,把它分配給isEmpty
  3. 私有構造函數創建一個公共靜態的getter屬性調用Empty這返回您的對象的實例,並調用通過一個true參數的私有構造函數
  4. 重載兩個運營商==!=檢查isEmpty是兩個

例真正

比方說,我有一個名爲ExampleClass類:

public class Example 
{ 
    public string Message; 
    private bool isEmpty; 

    public Example(string Message) 
    { 
     this.Message = Message; 
     isEmpty = false; 
    } 
} 

稱爲isEmptybool財產已被定義,以及作爲字符串屬性和分配給字符串的基本構造函數。

還需要定義一個私有構造函數,該構造函數接受一個布爾參數並將其分配給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); 
    }