Laden...

Objekt einer Klasse mit änderbarer Eigenschaft als konst. Eigenschaft einer anderen Klasse verwenden

Erstellt von Stefan.Haegele vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.119 Views
Stefan.Haegele Themenstarter:in
463 Beiträge seit 2009
vor 10 Jahren
Objekt einer Klasse mit änderbarer Eigenschaft als konst. Eigenschaft einer anderen Klasse verwenden

Hallo,

irgendwie stehe ich gerade auf dem Schlauch....

Ich habe eine Klasse "Money" diese wird z.B. in der Klasse "Rechnung" verwendet. Da sie dort nur lesbar sein soll, hat sie nur eine get Eigenschaft. Die Klasse Money hat natürlich get/set - und somit ist in der Klasse Rechung trotz der Einsachränkung, dass es keinen Setter änderbar....

Beispiel:



public class Money
{

public decimal _value {get;set}

}

public class Rechnung
{

public Money _netto {get;}
public Money _mwst {get;}

}


Warum sie beschreibbar ist verstehe ich schon, nur wie kann ich es verhindern?

Danke
Stefan

5.658 Beiträge seit 2006
vor 10 Jahren

Hi Stefan.Haegele,

eine so deklarierte Eigenschaft braucht immer einen Setter. Sonst könnte man ja auch nie einen Wert zuweisen, der dann gelesen werden soll. Wenn der Setter aber nicht von außen zugreifbar sein soll, kannst du ihn als private deklarieren:


public Money Netto { get; private set; }

// Edit
Alternativ kannst du die Eigenschaften auch so deklarieren:


private Money netto = new Money();
public Money Netto { get { return netto; } }

Christian

Weeks of programming can save you hours of planning

1.346 Beiträge seit 2008
vor 10 Jahren

Zusätzlich zu dem was MrSparkle gepostet hat:

Mach die Money Klasse immutable, d.h. sie kann nur beim erstellen gesetzt werden, danach aber nie wieder geändert werden.


public sealed class Money
 {
     public Money(decimal value)
     {
           _value = value;
     }

     public decimal _value {get; private set;}
 }

4.221 Beiträge seit 2005
vor 10 Jahren

Und dann machst Du noch readonly

readonly (C# Reference)

So schützt Du Dich selber (du kannst den Wert nur bei der Deklaration oder aus dem Konstruktor setzen).

Gruss
Programmmierhans

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo Stefan.Haegele,

public interface IReadOnlyMoney
{
   decimal Value { get; }
}

public class Money : IReadOnlyMoney
{
   public decimal Value { get; set; }
}

public class Rechnung
{
   public IReadOnlyMoney Netto { get; private set; }
   public IReadOnlyMoney Mwst  { get; private set; }
}

herbivore