3

我正在尝试在 C# 中创建 Money 数据类型(如int, )。但是,如果没有修饰符string,我似乎无法弄清楚如何使用它。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();

抱歉,如果这是一个愚蠢的问题,但我在网上找不到任何东西,我自己也无法弄清楚。

4

5 回答 5

3

你必须在某个地方更新它。如果您不想在成员声明中这样做,请在类构造函数中进行:

public MyClass()
{
     _money = new Money();
}
于 2013-07-17T19:23:35.380 回答
3

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

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);
于 2013-07-17T19:24:19.473 回答
2

使用隐式运算符将允许您将其设置为原始数据类型。

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);
于 2013-07-17T19:30:06.767 回答
1

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

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

    money.Raw = value;

    return money;
}

然后在调用代码中:

Money money = 10d;

但是恕我直言,我看不出这样做有什么好处,如果你真的需要一个可变类型,调用'new'来实例化它应该没有问题。

于 2013-07-17T19:29:03.400 回答
0

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

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

于 2013-07-17T19:26:21.487 回答