C# .Net 1.x中结构的空/空值
我需要为结构使用空值 我不知道哪一个是最好的选择。我曾考虑在结构上使用静态只读字段,但我不确定这是否是最好的选择。也许公共类上返回空值的方法是更好的选择 出于性能原因,我使用struct,因此将其更改为类不是一个选项。我不确定如果我使用静态字段,每个结构实例的大小都会增加C# .Net 1.x中结构的空/空值,c#,C#,我需要为结构使用空值 我不知道哪一个是最好的选择。我曾考虑在结构上使用静态只读字段,但我不确定这是否是最好的选择。也许公共类上返回空值的方法是更好的选择 出于性能原因,我使用struct,因此将其更改为类不是一个选项。我不确定如果我使用静态字段,每个结构实例的大小都会增加 有什么想法吗?在.net framework中常见的习惯用法是有一个名为“Empty”的静态只读字段,如Size.Empty 结构是否有任何自然无效的值?特别是,您可以随时编写: 最终所有的位都是0。如果由于某种原因(例如,你
有什么想法吗?在.net framework中常见的习惯用法是有一个名为“Empty”的静态只读字段,如
Size.Empty
结构是否有任何自然无效的值?特别是,您可以随时编写:
最终所有的位都是0。如果由于某种原因(例如,你有一个整数值,它在构造函数中总是设置为非零),那么这很好-将其用作你的“空”值。如果需要,可以使用该值创建静态字段:
public static readonly MyStruct Empty = new MyStruct();
请注意,添加静态字段不会给结构实例增加任何开销
但是,如果结构中的每一个可能的位模式都已经是有效值,那么您将需要一种不同的方法—要么向结构中添加一个额外的字段,要么向使用结构并可能需要表示“缺少”值的任何代码段添加一个额外的字段
你说使用类不是“出于性能原因”的一种选择——这是因为你对自己的情况进行了严格的基准测试吗?我喜欢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
属性bool
参数创建一个私有构造函数,该参数将其分配给isEmpty
Empty
的公共静态getter属性,该属性返回对象的实例,并通过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;
}
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);
}
然后需要定义一个静态getter,在本例中,它通过调用私有构造函数并将isEmpty
赋值为true来返回example
的新实例
public static Example Empty
{
get
{
return new Example(isEmpty: true);
}
}
一旦这样做了,就需要重载两个操作符。平等与不平等。如果不重载这两个运算符,则在尝试检查实例是否等于Example.Empty
时可能会出错
private Example(bool isEmpty)
{
this.isEmpty = isEmpty;
}
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);
}
您确定应该使用结构吗?你测量过了吗?是的,我使用日志和探查器进行测量。默认值是公共值,所以我不能将其用作空值。是的,我检查过了,内存性能更好,时间性能也更好。