我需要为结构使用空值。.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