在调用另一个构造函数之前更改值

本文关键字:调用 另一个 构造函数 | 更新日期: 2023-09-27 18:04:20

我一直在尝试创建一些"级联"构造器。其中一个打电话给另一个,提供了比之前更多的信息。到目前为止,我有两个是这样的。

public scan() : this(Environment.Local) { }
public scan(Environment env) {
    //it then does some stuff constructor-y things
}

我想做另一个可以调用我的第二个构造函数通过接受一个字符串,然后它将转换成一个Environment。以下内容:

public scan(string environment) : this(environment.toString()}

但是它似乎不像我希望的那样工作。是否有一种方法来传递这个字符串,然后调用我的其他环境接受构造函数?

而且我希望做出的改变将比toString()更实质性,但我用它来说明这一点。

在调用另一个构造函数之前更改值

我将这样做:创建一个静态方法来处理从字符串到enum的转换。在这个静态方法中,检查有效性,如果不是,则返回本地。

public class scan
{
    public scan(Environment value) { }
    public scan() : this(Environment.Local) { }
    public scan(string s) : this(ParseEnum(s)) { }
    private static Environment ParseEnum(string s)
    {
        // default to local
        Environment value = Environment.Local;
        // try parsing the string
        Enum.TryParse<Environment>(s, out value);
        // if sucessful, the new value will be returned
        // if not, Environment.Local will be returned
        return value;
    }
    public enum Environment
    {
        Local,
        NotLocal,
        AnotherOne
    }
}

ToString将不起作用,因为您最终会递归地调用构造函数(加上在string上调用ToString没有多大意义)。听起来你想要将字符串Parse设置为Environment值:

public scan(string environment) : 
      this((Environment)Enum.Parse(typeof(Environment),environment))
{
}

但是由于无效的字符串值而引发异常的风险,在编译时无法捕获。

如果Environment是一个结构体或类,那么您可以覆盖强制转换操作符并像这样重写构造函数:

public scan(string environment) : this((Environment)environment)

不允许在Enum类型上重载操作符,所以你在这里就不走运了。

No。你不能在其他构造函数的内部调用构造函数,也不能在调用其他构造函数之前对传递给其他构造函数的参数进行操作。是的,您可以调用其他构造函数并传递方法执行的结果,如ctor() : this(MyMethod()),但它仍然与从您的ctor内部调用其他构造函数不同。

通常使用的是:

public scan() { // general initialization logic }
public scan(Environment env) : this() 
{
    //some special logic here that uses parameter env
}

或者类似windows窗体的InitializeComponent方法。初始化方法,包含初始化逻辑。