You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DateTime默认值判断逻辑异常,如何替换(value != defaultValue)代码?

问题原因与解决方案

问题出在引用类型的比较逻辑上:当值类型(比如DateTime)被装箱为object后,每次装箱都会生成新的对象实例。此时用!=进行比较时,实际是在比较两个对象的引用地址,而非值本身,所以即使值相同,也会判定为不相等。

正确的做法是使用object.Equals(value, defaultValue)替代!=的判断,这个方法会自动处理值类型的值比较、可空类型的null判断,以及引用类型的引用比较,完全符合预期逻辑。

修改后的代码

using System;
using System.Reflection;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            DateClass v = new DateClass();
            v.Date1 = default;
            v.Date2 = default;          

            foreach (PropertyInfo pi in v.GetType().GetProperties())
            {
                var type = pi.PropertyType;
                var value = pi.GetValue(v);
                var defaultValue = GetDefault(type);

                if (!object.Equals(value, defaultValue))
                {
                    Console.WriteLine("not equal");
                }
                else
                {
                    Console.WriteLine("equal");
                }
            }
        }

        public static object GetDefault(Type type)
        {
            if (type.IsValueType)
            {
                return Activator.CreateInstance(type);
            }
            return null;
        }
    }

    public class DateClass
    {
        public DateTime Date1 { get; set; }
        public DateTime? Date2 { get; set; }
    }
}

额外说明

  • 对于DateTime?(可空值类型),default是null,object.Equals会正确判断null与null相等。
  • 对于值类型(如DateTime),object.Equals会调用该值类型的Equals方法,比较实际的数值而非引用地址。

内容的提问来源于stack exchange,提问作者Nisha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 03:15:50