【问题标题】:Conditionally Call Constructor in C#C# 有条件地调用构造函数
【发布时间】:2013-05-22 00:22:01
【问题描述】:

假设我在 C# 中有以下 Foo 的构造函数:

public Foo()
{
    // ...
}
protected Foo(bool connect)
    : this()
{
    // ...
}

我正在寻找一种仅在connect 参数为true 时才执行this() 部分的方法。这是一种方法吗?

(对于好奇的人:这背后的原因是Foo 类创建连接到某些事物的对象;当它们被创建时,它们也应该始终尝试连接。现在,我正在创建一个模拟器(或 MOCK) 为它扩展 Foo 类。这就是我添加 protected 构造函数的原因;当使用这个时,应该有不创建实际连接的选项。我想实现这一点尽可能少地更改 Foo 类。)

【问题讨论】:

    标签: c# constructor conditional


    【解决方案1】:

    不,您不能以这种方式有条件地调用this()。但是,您可以将条件代码移动到 protected 构造函数,然后从 public 之一调用该构造函数:

    public Foo() : this(true)
    {
    
    }
    
    protected Foo(bool connect)
    {
       if(connect) //...
    }
    

    【讨论】:

    • 我个人赞成这种方法。它避免了调用非构造方法的缺点,即readonly 字段不能在非构造方法中初始化。它还可以扩展到许多构造函数(所有这些构造函数都可以调用受保护甚至私有的“主”构造函数)——尽管调用 init() 方法也可以扩展。
    • 是的,其实我觉得这也是最好的办法
    • 考虑到@MatthewWatson 所说的,这确实可能是正确的答案。谢谢!
    【解决方案2】:

    一种方法是创建一个init() 函数:

    public Foo()
    {
        // ...
        init();
    }
    protected Foo(bool connect)
    {
        // ...
        if (connect) {
            init();
        }
    }
    

    【讨论】:

    • 我想这确实是最好的方法。 init() 是私有的,课程不会有明显变化,这正是我所需要的。
    • 此方法不适用于 readonlyinit (C# 9) 成员顺便说一句。
    【解决方案3】:

    你不能有条件地调用 this() 所以你必须使用一个方法来代替

    public Foo()
    {
        ConnectCode();
    }
    protected Foo(bool connect)
        : this()
    {
        if(connect)
            ConnectCode();
    }
    

    另一种方式(不知道好不好或者满足你的需要)是:

    public Foo(bool connect=true)
    {
        if(connect)
            ConnectCode();
    }
    

    这样调用 Foo() 的代码不需要更改,但您会失去受保护的可访问性

    【讨论】:

      猜你喜欢
      • 2011-07-18
      • 2017-07-19
      • 2015-01-20
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      • 2021-07-24
      • 1970-01-01
      相关资源
      最近更新 更多