gpt4 book ai didi

c# - C#中如何检查一个对象是否有默认值

转载 作者:太空宇宙 更新时间:2023-11-03 18:53:48 26 4
gpt4 key购买 nike

我有一个对象,我想在下面的代码中检查它是否包含默认值,但这并没有削减它。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace Rextester
{
public class Program
{
public static void Main(string[] args)
{
MyClass obj1 = new MyClass();
MyClass obj2 = null;

if(obj1 == new MyClass())
Console.WriteLine("Initialized");

if(Object.ReferenceEquals(obj1, new MyClass()))
Console.WriteLine("Initialized");

}
}
}

public class MyClass
{
public int Value {get; set; }

public MyClass()
{
this.Value = 10;
}
}

我也用过Object.ReferenceEquals()但这并不能解决问题。

这是 fiddle 我正在努力。

有没有办法检查对象是否包含默认值,或者对象是否为空?


编辑:如果新初始化的对象具有许多嵌套属性,如何检查它们是否包含默认值?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace Rextester
{
public class Program
{
public static void Main(string[] args)
{
MyClass obj1 = new MyClass();
MyClass obj2 = null;

if(obj1 == new MyClass())
Console.WriteLine("Initialized");

if(Object.ReferenceEquals(obj1, new MyClass()))
Console.WriteLine("Initialized");


}
}
}

public class MyClass
{
public int Value {get; set; }

public MyNestedClass MyProperty { get; set; }

public MyClass()
{
this.Value = 10;
this.MyProperty = new MyNestedClass();
}
}

public class MyNestedClass
{
public string SomeStringProperty { get; set; }

public MyNestedClass()
{
this.SomeStringProperty = "Some string";
}

}

这是 fiddle在嵌套对象的情况下。

最佳答案

您可以通过覆盖 EqualsGetHashCode,创建并保存一个不可变的“默认”实例,并将值与其进行比较来实现您的目标:

public class MyClass {
public static readonly MyClass DefaultInstance = new MyClass();
public int Value { get; set; }
public MyClass() {
this.Value = 10;
}
public override int GetHashCode() {
return Value.GetHashCode();
}
public override bool Equals(Object obj) {
if (obj == this) return true;
var other = obj as MyClass;
return other?.Value == this.Value;
}
}

现在您可以通过调用检查实例是否等于新创建的实例

if (MyClass.DefaultInstance.Equals(instanceToCheck)) {
... // All defaults
}

您可以通过更改 DefaultInstance 对象来更改“默认”实例的含义。

注意:这个技巧只适用于不可变的 MyClass。否则某些代码可以执行 MyClass.DefaultInstance.Value = 20 并更改“默认”对象。

关于c# - C#中如何检查一个对象是否有默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50426660/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com