使用默认参数而不是默认构造函数调用构造函数

时间:2018-01-21 20:57:02

标签: c# struct

我想调用一个struct的构造函数,它具有所有参数的默认值。但是当我调用MyRectangle的无参数构造函数时,一个未定义的构造函数被调用。这是为什么?是否有可能没有来自我创建的构造函数?

using System;

namespace UebungClasses
{
    class Program
    {
        static void Main(string[] args)
        {
            MyRectangle sixRec = new MyRectangle(3, 2);
            MyRectangle oneRec = new MyRectangle();

            Console.WriteLine("area of six: " + sixRec.Area() + " area of one: " + oneRec.Area());
        }
    }

    public struct MyRectangle
    { 
        public MyRectangle(double w = 1, double l = 1)
        {
            width = w;
            length = l;
            Console.WriteLine("Width: " + width + " Lenght: " + length);
        }

        public double Area()
        {
            return width * length;
        }

        private double width;
        private double length;
    }
}

2 个答案:

答案 0 :(得分:3)

不,基本上。如果你使用new MyRectangle(),它总是更喜欢默认构造函数(意思是:struct的情况下为零初始化)。

如果您正在处理整数,一个可能的解决方法是在属性访问器中使用xor和您想要的默认值 - 这意味着当字段为零时,您将从访问器中获取默认值。不幸的是,使用double执行此操作需要使用不安全的代码来重新解释类型。

另一个可能的解决方案是添加一个可以使用的虚拟参数,例如:

new MyRectangle(dummy: true)

这个dummy参数除了之外什么都没有允许你选择自定义构造函数。

另一个最终选择是使用工厂方法(static MyRectangle Create(...))而不是构造函数。

答案 1 :(得分:1)

这里的问题是编译器将始终首先解析为没有默认参数的有效构造函数。它有点像泛型,非泛型过载获胜,在这里,非默认参数重载是首选。

因为结构都有一个无参数构造函数,所以它将被选择在你的构造函数之上。

如果您需要不同的默认矩形,可以采用以下方法:

public struct MyRectangle
{
    private readonly bool isNotDefault;

    public MyRectangle(double w, double l)
    {
        isNotDefault = true;
        width = w;
        length = l;
    }

    public double Area()
    {
        //Notice the use of the properties,
        //not the backing fields.
        return Width * Length;             
    }

    private readonly double width, length;
    public double Width => isNotDefault ? width: 1;
    public double Length => isNotDefault ? length : 1;

    public override string ToString()
        => $"Width: {Width} Lenght: {Length}";
}

我不建议我为矩形推荐这个,毕竟零大小的矩形似乎是一个合理的选择,但有些情况下默认值确实没有意义。一个明显的例子是表示有理数的结构,其中默认值是数学不确定:0/0