是否可以在构造函数中更改为不同的构造函数?

时间:2017-06-11 20:49:08

标签: c# constructor

我的构造函数中有一些条件。如果参数不符合这些条件,我想使用另一个重载的构造函数。这可能吗?

示例代码:

public Header(byte[] givenData, Utilities.FileType defaultingFileType)
{
    int index = -1;
    if (givenData != null)
    {
        // possibly alter int index here
    }
    if (index != -1)
    {
        // found match, parse givenData
    }
    else
    {
        // no suitable match found, default to given file type
        this = Header(defaultingFileType);
    }
    // etc.
}

该行:

this = Header(defaultingFileType);

是我不可能尝试更改为另一个构造函数。此时如何更改为另一个构造函数?如果我无法更改为另一个构造函数,那么我必须在此时将其他构造函数的代码复制/粘贴到此构造函数中。我想在此处使用的构造函数是:

public Header(Utilities.FileType givenFileType){}

3 个答案:

答案 0 :(得分:2)

您无法通过其他构造函数调用构造函数,但您可以使用以下解决方案之一: 1.创建静态方法并运行构造函数:

public class Class1
{
 public Class1()
 {
 }
 public Class1(param1)
 {
 }
 public Class1(param1,param2)
 {
 }
 public Class1(param1,param2,param3)
 {
 }
 public static Class1 GetNew(param1,param2,param3)
 {
  if(param1 != null && param2!= null && param3!= null)
  {
    return new Class1(param1,param2,param3);
  }
  else if(param1 != null && param2!= null && param3== null)
  {
    return new Class1(param1,param2);
  }
  else if(param1 != null && param2 == null && param3== null)
  {
    return new Class1(param1);
  }
  else 
  {
    return new Class1();
  }

 }
}

2 - 使用一个构造函数和创建方法:

public class Class2
{
 public Class1(param1,param2,param3)
 {
  if(param1 != null && param2!= null && param3!= null)
  {
    Method1(param1,param2,param3);
  }
  else if(param1 != null && param2!= null && param3== null)
  {
    Method1(param1,param2);
  }
  else if(param1 != null && param2 == null && param3== null)
  {
    Method1(param1);
  }
  else 
  {
    Method1();
  }
 }
 public void Method1(param1,param2,param3)
 {
 }
 public void Method1(param1,param2)
 {
 }
 public void Method1(param1)
 {
 }
 public void Method1()
 {
 }
}

答案 1 :(得分:1)

您无法从构造函数体内切换到不同的构造函数。如果这是你需要的东西,你最好的选择是切换到私有构造函数并使用静态方法来调用构造函数或使用工厂模式。

答案 2 :(得分:0)

如果您只想使用默认值,可以使用以下语法:

public Header(byte[] givenData, Utilities.FileType defaultingFileType = [DEFAULT_VALUE])
{
...
}

这只适用于.NET 3.5,默认值必须保持不变。

如果您发现这个不足,我认为解决此问题的最佳方法是静态方法,用于创建此类的实例。如果您想避免不恰当地使用该类,您甚至可以将构造函数设置为private

此外,您还可以创建一些处理条件所在字段的私有函数。然后每次只使用不同的参数调用此函数。