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
相关产品推荐
相关产品推荐

