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;

しかし、IMHO、それを行うことに利点はないと思います。変更可能な型が本当に必要な場合は、「new」を呼び出してインスタンス化することに問題はありません。

于 2013-07-17T19:29:03.400 に答える
0

プライベートコンストラクターを追加すると、部外者がインスタンスを「新しく作成」するのを防ぐことができます...しかし、それを作成するためのファクトリーメソッドまたは何かを作成する必要もあります(プライベートコンストラクターにアクセスできるように、クラスで)。そうでなければ、あなたのクラスはかなり役に立ちません!

とはいえ、インスタンスを「新しく」したくない理由がわかれば、いくつかのヒントを提供できるかもしれません。

于 2013-07-17T19:26:21.487 に答える