2011-01-27 37 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); 
    }