2013-07-17 3 views
3

Я пытаюсь создать тип данных Money (например, int, string) в C#. Однако я не могу понять, как использовать его без модификатора 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(); 

Извините, если это глупый вопрос, но я не мог найти ничего в Интернете, и я не мог понять это сам.

+2

С какой проблемой вы сталкиваетесь? –

+8

Почему вы не хотите использовать 'new'? –

+4

Не используйте 'float' за деньги. Используйте 'decimal'. – mak

ответ

4

Вам нужно будет что-то обновить. Если вы не хотите, чтобы сделать это в объявлении члена, то сделать это в конструкторе класса:

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

Лучше, чем это был бы метод Factory, поэтому вы можете сделать что-то вроде Money.Create (value) – bateloche

+0

Вы используете метод Factory, когда вам нужно выбирать между различными подтипами. Вероятно, это не так. –

+0

Ни в коем случае, ответ Эми показывает хороший способ создания объекта Money из метода. – bateloche

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); 
+0

Ваш метод 'From' может быть еще более упрощен с использованием инициализации объекта, т. Е.' Return new Money {Raw = val}; ' – James

0

Добавление приватный конструктор предотвратило бы от посторонних «newing вверх» экземпляр ... но тогда вы должны написать фабричный метод или что-то для его создания (в ваш класс, чтобы он имел доступ к частному конструктору). В противном случае ваш класс довольно бесполезен!

Сказали, может быть, если бы мы знали, почему вы не хотели иметь возможность «нового» экземпляра, мы могли бы предоставить несколько советов.

1

Если вы не хотите использовать свойство Raw, чтобы присвоить значение, которое вы можете сделать перегрузку оператора, что-то вроде, что:

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

    money.Raw = value; 

    return money; 
} 

А потом в вызывающем коде:

Money money = 10d; 

Но ИМХО , я не вижу никакого преимущества в этом, если вам действительно нужен тип muttable, не должно быть проблем с вызовом 'new' для его создания.

1

Использование 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); 
Смежные вопросы