C# .Net 1.x中结构的空/空值

C# .Net 1.x中结构的空/空值,c#,C#,我需要为结构使用空值 我不知道哪一个是最好的选择。我曾考虑在结构上使用静态只读字段,但我不确定这是否是最好的选择。也许公共类上返回空值的方法是更好的选择 出于性能原因,我使用struct,因此将其更改为类不是一个选项。我不确定如果我使用静态字段,每个结构实例的大小都会增加 有什么想法吗?在.net framework中常见的习惯用法是有一个名为“Empty”的静态只读字段,如Size.Empty 结构是否有任何自然无效的值?特别是,您可以随时编写: 最终所有的位都是0。如果由于某种原因(例如,你

我需要为结构使用空值

我不知道哪一个是最好的选择。我曾考虑在结构上使用静态只读字段,但我不确定这是否是最好的选择。也许公共类上返回空值的方法是更好的选择

出于性能原因,我使用struct,因此将其更改为类不是一个选项。我不确定如果我使用静态字段,每个结构实例的大小都会增加


有什么想法吗?

在.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; }
        }
    }

我知道这是一个相当晚的答复,但这里值得一提的是我的实现

你必须:
  • 创建名为isEmpty的私有
    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);
        }
    

    您确定应该使用结构吗?你测量过了吗?是的,我使用日志和探查器进行测量。默认值是公共值,所以我不能将其用作空值。是的,我检查过了,内存性能更好,时间性能也更好。