加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在C#中创建一个空对象

发布时间:2020-12-15 03:57:28 所属栏目:百科 来源:网络整理
导读:Martin Fowler的重构讨论了创建空对象以避免大量的内容 if (myObject == null) 试验. 这样做的正确方法是什么?我的尝试违反了“构造函数中的虚拟成员调用”规则. 这是我的尝试: public class Animal{ public virtual string Name { get; set; } public vir
Martin Fowler的重构讨论了创建空对象以避免大量的内容
if (myObject == null)

试验.
这样做的正确方法是什么?我的尝试违反了“构造函数中的虚拟成员调用”规则.
这是我的尝试:

public class Animal
{
    public virtual string Name { get; set; }
    public virtual string Species { get; set; }
    public virtual bool IsNull 
    { 
        get { return false; }
    }
}

public sealed class NullAnimal : Animal
{
    public override string Name
    {
        get{ return "NULL"; }
        set { }
    }
    public override string Species
    {
        get { return "NULL"; }
        set { }
    }
    public virtual bool IsNull
    {
        get { return true; }
    }
}

解决方法

我倾向于同意 Wyatt Barnett’s answer,因为在创建这些类型的“null”对象时应该表现出克制.也就是说,有一些很好的理由这样做.不定期的.

我也倾向于同意Supertux’s answer,因为一个null对象的整个点是不需要检查它是否为null,所以你应该丢失IsNull属性.如果您真的觉得您需要IsNull属性,那么再次读取Wyatt的响应并重新考虑.

谢谢CraigTP for the nice links了解更多信息.好东西.

现在我将假设在你的实际代码中,你实际上有一个构造函数尝试设置Name或Species的值(不管你真正的代码等同于什么).否则,为什么会得到“构造函数中的虚拟成员调用”警告/错误?我使用新的MyProperty {get;组; }快捷方式我自己(特别是当在结构体中使用时,不要让我开始关于序列化版本控制).您的解决方案是不使用快捷方式,而是使用老式的方式.

public class Animal {
    protected Animal() { }

    public Animal(string name,string species) {
        _Name = name;
        _Species = species;
    }

    public virtual string Name {
        get { return _Name; }
        set { _Name = value; }
    }
    private string _Name;

    public virtual string Species {
        get { return _Species; }
        set { _Species = value; }
    }
    private string _Species;
}

public sealed class NullAnimal : Animal {
    public override string Name {
        get { return String.Empty; }
        set { }
    }
    public override string Species {
        get { return String.Empty; }
        set { }
    }
}

这解决了在构造函数中设置虚拟属性的问题.相反,您正在设置您的私有字段值(如果使用快捷方式,则您无法引用该参数).要获得额外的信用,请编译这两种方法,并使用反射器查看生成的程序集.

我使用{get;组; }快捷方式,我越不喜欢它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读