Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在调用另一个构造函数之前更改值_C# - Fatal编程技术网

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

C# 在调用另一个构造函数之前更改值,c#,C#,我一直在尝试创建一些“级联”构造函数。一个打电话给另一个,提供了比以前更多的信息。到目前为止,我看到的两个是这样的 public scan() : this(Environment.Local) { } public scan(Environment env) { //it then does some stuff constructor-y things } 我想创建另一个可以调用第二个构造函数的构造函数,方法是接受一个字符串,然后将其转换为环境。大意如下: public scan(

我一直在尝试创建一些“级联”构造函数。一个打电话给另一个,提供了比以前更多的信息。到目前为止,我看到的两个是这样的

public scan() : this(Environment.Local) { }
public scan(Environment env) {
    //it then does some stuff constructor-y things
}
我想创建另一个可以调用第二个构造函数的构造函数,方法是接受一个字符串,然后将其转换为
环境
。大意如下:

public scan(string environment) : this(environment.toString()}
但它似乎不想像我所希望的那样起作用。有没有办法传入这个字符串,然后调用我的另一个环境接受构造函数


另外,我希望所做的更改将不仅仅是一个
toString()
,而是更为实质性的更改,但我用它来说明这一点。

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

通常使用的是:

public scan() { // general initialization logic }

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

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

如果
环境
是一个结构或类,那么您可以重写强制转换运算符并重写构造函数,如下所示:

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

不允许在枚举类型上重载运算符,因此您在这里运气不好。

ToString
不起作用,因为您最终以递归方式调用构造函数(加上对
字符串
调用
ToString
没有多大意义)。听起来您想
将字符串解析为
环境
值:

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

但是,您可能会因为无效的字符串值而引发异常,而该字符串值在编译时无法捕获

我会这样做:创建一个静态方法,处理从字符串到枚举的转换。在这个静态方法中,检查有效性,如果无效,则返回local

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
    }
}
公共类扫描
{
公共扫描(环境值){}
公共扫描():此(Environment.Local){}
公共扫描(字符串s):此(ParseEnum)){
私有静态环境ParseEnum(字符串s)
{
//默认为本地
环境值=Environment.Local;
//尝试分析字符串
Enum.TryParse(s,out值);
//如果成功,将返回新值
//否则,将返回Environment.Local
返回值;
}
公共枚举环境
{
地方的
不是本地的,
另一个
}
}

您正在使用的环境类是什么?它不是System.Environment静态类。@不是,它是我在与scan()相同的类中创建的枚举。是的,您可以。调用其他构造函数与调用其他方法几乎相同。一旦调用了构造函数,它基本上就是重定向到您想要使用的任何方法。包括其他构造函数。@请添加屏幕截图,在其他构造函数中调用constructor。。。这与调用方法不同,因为构造函数只在创建对象时调用一次,而不像方法(您可以在代码中的任何位置和任何时间调用该方法)。构造函数可以有多个参数重载,因此您可以从另一个构造函数调用构造函数。这是OOP 101。@Bauss只能在ctor签名中内联执行,如
ctor():这(字符串s)
,但不能在构造函数中执行(因此执行一些逻辑,然后才调用其他ctor)。这就是为什么它与方法不同的原因。@Fabjan如果您是正确的,您不能从另一个构造函数的主体内部调用其他构造函数。我的回答不清楚,回答得很好。幸好编译器在构建模棱两可的构造函数之前就能捕捉到它。正如我在下面指出的那样,可以使用静态方法修复无效的字符串值。更新了代码以使用TryParse(),我觉得这有点干净。