使用没有new修饰符的自己的数据类型

时间:2013-07-17 19:19:50

标签: c#

我正在尝试在C#中创建Money数据类型(如intstring)。但是,如果没有new修饰符,我似乎无法解决如何使用它。该类不能是静态的,因为它必须分配给它。我认为必须有一种方法,这是我为课程所拥有的代码,我可能完全错了。

public class Money {
    private float _raw;

    public float Raw {
        get {  return _raw;  }
        set {  _raw = value;  }
    }

    public string Pound {
        get {  return "£" + string.Format("{0:0.00}", _raw);  }
    }
} 

然后我有我正在调用它的类,并且只想使用:

private Money _money;

而不是:

private Money _money = new Money();

很抱歉,如果这是一个愚蠢的问题,但我在网上找不到任何东西,也不能自己解决。

5 个答案:

答案 0 :(得分:4)

你必须在某个地方新建它。如果您不想在成员声明中执行此操作,请在类构造函数中执行此操作:

public MyClass()
{
     _money = new Money();
}

答案 1 :(得分:4)

另一种解决方案涉及使用某种工厂方法。

public class Money {
    private float _raw;

    public float Raw {
        get {  return _raw;  }
        set {  _raw = value;  }
    }

    public string Pound {
        get {  return "£" + string.Format("{0:0.00}", _raw);  }
    }

    public static Money From(float val) 
    {
        Money x = new Money();
        x.Raw = val;
        return x;
    }
} 

用法:

Money m = Money.From(9.95);

答案 2 :(得分:2)

使用impilicit运算符可以将其设置为原始数据类型。

http://haacked.com/archive/2012/09/30/primitive-obsession-custom-string-types-and-self-referencing-generic-constraints.aspx

public class Money

{
    private float _raw;

    public float Raw
    {
        get { return _raw; }
        set { _raw = value; }
    }

    public string Pound
    {
        get { return "£" + string.Format("{0:0.00}", _raw); }
    }


    public static implicit operator Money(float value)
    {
        return new Money(){Raw = value};
    }
}

然后你可以像这样使用它。

 Money m = 12;
 Console.Write(m.Raw);

答案 3 :(得分:1)

如果您不想使用属性Raw来赋值,则可以使运算符重载,如下所示:

public static implicit operator Money(Double value)
{
    var money = new Money();

    money.Raw = value;

    return money;
}

然后在调用代码中:

Money money = 10d;

但恕我直言,我认为没有任何优势,如果你真的需要一个muttable类型,调用'new'来实例化它应该没问题。

答案 4 :(得分:0)

添加私有构造函数会阻止外人“新建”一个实例......但是你还需要编写一个工厂方法或其他东西来创建它(在你的类中,以便它可以访问私有构造函数)。否则你的课很没用!

也就是说,如果我们知道你为什么不想“新建”一个实例,我们可能会提供一些提示。