可空的datetime属性和它的字段有什么区别?

时间:2018-06-14 08:59:53

标签: c# deserialization nullable

我有一个桌面应用,它使用序列化并在关闭之前保存数据,并使用以下代码从文件加载相同的数据:

IFormatter formatter = new BinaryFormatter();
var array = (MyClass[])formatter.Deserialize(stream);

MyClass有一个datime属性及其字段。我需要让它可以为空但我得到值不能为空。\ r \ nParameter name:value InnerException当我使它们都可以为空时。

    public DateTime? MyDate
    {
        get
        {
            return myDate;
        }
        set
        {
            if (myDate != value)
            {
                myDate = value;
            }
        }
    }

然后,我更新了我的代码如下

    public DateTime? MyDate
    {
        get
        {
            return myDate;
        }
        set
        {
            if (value != null && myDate != value)
            {
                myDate = value;
            }
        }
    }

反序列化过程中出现错误,如前所述。然后我必须使字段不可为空并改变属性,如下所示

            public DateTime? MyDate
    {
        get
        {
            if (myDate == DateTime.MinValue)
            {
                return null;
            }
            else
            {
                return myDate;
            }
        }
        set
        {
            if (myDate != value)
            {
                if (value == null)
                {
                    myDate = DateTime.MinValue;
                }
                else
                {
                    myDate = (DateTime)value;
                }

                onPropertyChanged("MyDate");
            }
        }
    }

该解决方法按预期工作,但我不明白为什么第二个代码不适用于DateTime,而相同的代码适用于可为空的十进制属性。当它们具有null值时,字段和属性之间有什么区别?

1 个答案:

答案 0 :(得分:0)

if (myDate != value)
{
     myDate = value;
}

可能是你的问题,不是很确定,但是性能明智无论如何都不聪明,因为设置值需要的处理能力低于比较它。

为什么不这样做:

public DateTime? MyDate { get;set; }

如果能解决您的问题,请告诉我们!