我正在尝试在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();
很抱歉,如果这是一个愚蠢的问题,但我在网上找不到任何东西,也不能自己解决。
答案 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运算符可以将其设置为原始数据类型。
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)
添加私有构造函数会阻止外人“新建”一个实例......但是你还需要编写一个工厂方法或其他东西来创建它(在你的类中,以便它可以访问私有构造函数)。否则你的课很没用!
也就是说,如果我们知道你为什么不想“新建”一个实例,我们可能会提供一些提示。