构造函数重载和类参数

时间:2012-12-12 12:01:27

标签: c# oop constructor

有没有更好的方法来做我正在做的事情:

class Sample {

int SampleValueX, SampleValueY;
string SampleFacing;    

public Sample(int samplevaluex, string samplefacing)
{
    SampleValueX = startpositionx;
    SampleValueY = 0;
    SampleFacing = samplefacing;
}

public Sample(int samplevaluey, string samplefacing)
{
    SampleValueX = 0;
    SampleValueY = startpositionx;
    SampleFacing = samplefacing;
}
}

这甚至被称为构造函数重载吗?如果我错了,请纠正我。

4 个答案:

答案 0 :(得分:10)

您可以使用可选参数

class Sample {

  int SampleValueX, SampleValueY;
  string SampleFacing;    

  public Sample(string samplefacing, int samplevaluex = 0, int samplevaluey = 0)
  {
    SampleValueX = samplevaluex;
    SampleValueY = samplevaluey;
    SampleFacing = samplefacing;
  }

}

请注意,可选参数必须出现在强制性参数之后

答案 1 :(得分:4)

这不起作用,因为你有两个具有相同参数的构造函数,并且在构造函数中你无法区分一个表单与另一个表单。

使用Visual Studio 2008及后续版本,您可以使用object initializer syntax

初始化对象
    Sample sampleInstance = new Sample
    {
        SampleValueX = 0,
        SampleValueY = 10,
        SampleFacing = "MySample"
    };

这将消除初始化内部成员的需要 当然,这要求您的内部属性变为公共属性,并非总是如此。

class Sample
{
    public int SampleValueX {get;set;};
    public int SampleValueY {get;set;};
    public string SampleFacing {get; set;};

    ......

答案 2 :(得分:2)

在我看来,这种逻辑不会增加课堂价值。如果该类有3个参数,并且您想从构造函数中设置它们,我将添加一个带有3个参数的构造函数,并在构造函数调用中将其设置为0。

对于类用户来说,这种方式会更清楚类参数值是什么。

答案 3 :(得分:2)

我同意可选参数可能就是你想要的。另一种选择可能是:

class Sample
{
    int SampleValueX,  SampleValueY;
    string SampleFacing;

    public Sample(XSetting xSetting)
    {
        SampleValueX = xSetting.X;
        SampleValueY = 0;
        SampleFacing = xSetting.SampleFacing;
    }

    public Sample(YSetting ySetting)
    {
        SampleValueX = 0;
        SampleValueY = ySetting.Y;
        SampleFacing = ySetting.SampleFacing;
    }
}

public class XSetting
{
    public int X { get; set; }
    public string SampleFacing { get; set; }
}

public class YSetting
{
    public int Y { get; set; }
    public string SampleFacing { get; set; }
}

正如您的代码示例所示,这可能有点过分。

您的代码示例不会编译btw。