2016-10-19 2 views
7

Gibt es eine Möglichkeit, C# -Objektwerte auf einmal zu ändern ... in einer Zeile?C# initialisierte Objektwerte

Also wenn ich eine Klasse Result mit string msg und bool isPositive und ich rufe schon irgendwo Konstruktor vor wie var result = new Result(); kann ich Werte irgendwie ändern, indem Sie nicht eingeben:

Aber etwas zu tun, wie das, was Sie während tun können instanziierenden:

result { msg = "", bool = true} 

ich weiß, dass ich es durch Instanziieren wieder ein neues Objekt tun können:

var result = new Result() { msg = "", bool = true} 

aber das ist nicht meine Frage :)

+2

Nein, es ist nicht. Es ist eine gute Sache, dass Sie dies nicht tun können, da es Lesbarkeit und Wartbarkeit schmerzt, was immer Ihre erste Sorge sein sollte. –

+0

Sie wissen, dass die Initialisierungssyntax kompiliert nur im Grunde die gleiche Sache mit nur einem temporären Wert –

+0

VB.Net hat 'mit', die ähnlich ist, gibt es keine Äquivalenz in C#. –

Antwort

5

Warum Sie keine Methode erstellen, die für Sie tun ...

public void SetResult(string msg, bool flag) 
{ 
    myFlag = flag; 
    myMsg = msg; 

} 

und Sie dann rufen Sie es auf:

myResult.SetResult("xxx", flase); // one line 
+0

Pedantic, aber: Tippfehler für die Einstellung der 'bool' in Ihrem Methodenaufruf - ist" 'fase'", sollte "' false' " –

+0

Schade C# hat nicht die Funktion, die ich will, aber nette Abhilfe – Norgul

3

Sie können eine Funktion schreiben Werte zurückgesetzt. Zum Beispiel:

public class Result 
{ 
    ... 
    public void ResetResult() 
    { 
     msg = "xxxxxx"; 
     boole = false; 
    } 

} 

Dann Ihre Reset durchzuführen,

var result = new Result() { msg = "", boole = true} 
//...Do whatever you want to do with result. 
result.ResetResult(); 
//...Do whatever you want to do with the *reset* result. 
3

Sie können einen Setter machen :

class Result 
{ 
    public string msg; 
    public bool boolean; 

    public SetValues(string message, bool boolean) 
    { 
     msg = message; 
     this.boolean = boolean; 
    } 
} 

Dann können Sie anrufen:

public SetValues(string message = "", bool boolean = false) 
{ 
    msg = message; 
    this.boolean = boolean; 
} 

So können Sie die Methode aufrufen, ohne Parameter angeben, und es:

SetValues("a string", true); 

Sie auch die Vorteile der optionalen Parameter nehmen funktioniert als ein Reset:

SetValues(); 

Aber ich werde immer noch empfehlen, Initialisierungsliste zu verwenden, da ein Setter, der mehrere Eigenschaften setzt, nicht wirklich eine gute Übung ist, da Sie jeden auf verschiedene Arten einstellen können, und trotzdem einen Teil der SRP verletzt.

+0

Isn ' t das genauso wie @ ΦXocę 웃 Пepeúpa ss Antwort? –

+1

öffentliche bool bool; Kompiliert sich das sogar in Ihrem PC? –

+0

@GeoffJames Ich schrieb, als er es gepostet hat. Auch diese Antwort enthält die Definition der Methode, anstatt eine leere, aber es ist das gleiche Prinzip – meJustAndrew

1

Explizit können Sie eine Methode in Ihrer Klasse implementieren, das tut, was Sie brauchen, zum Beispiel:

public class Result 
    { 
     public string Property1 { get; set; } 
     public int Property2 { get; set; } 

     //directly in the instatation of the object 
     public Result() 
     { 
      this.Property1 = "a"; 
      this.Property2 = 1; 
     } 

     //or explicitely within a method 
     public void ChangeValues() 
     { 
      this.Property1 = "a"; 
      this.Property2 = 1; 
     } 

     //or explicitely setting the values from outside as parameters 
     public void ChangeValues(string property1, int property2) 
     { 
      this.Property1 = property1; 
      this.Property2 = property2; 
     } 

    } 

ussage:

//option 1 
var result = new Result(); //values would be already set here 

//option 2 
var result = new Result(); 
result.ChangeValues(); //values would be set here 

//option 3 
var result = new Result(); 
result.ChangeValues("a",1); 

Sie auch durch die Eigenschaften, um laufen könnte jeder einstellen eine mit anderen Werten, aber das wäre ein bisschen Overkill, denke ich

0

OK, also das ist sehr ähnlich - (fast das gleiche) fast - wie der andere hier antwortet.

Ich dachte, ich ein wenig andere Perspektive auf den anderen Antworten geben würde - nur eine alternative Möglichkeit bietet ein public Verfahren der Verwendung zu nennen ...


Sie könnten die „default“ Werte definieren die Eigenschaften innerhalb der Result Klasse, indem const Ameisen (oder auch nur normale Felder) verwendet werden.

Dann legen Sie die Standardwerte der Eigenschaften auf diese Konstanten (oder Felder, je nachdem) fest. Wenn Sie einen neuen Result() ohne Initialisierer erstellen, wird das Result Objekt mit diesen Standardwerten erstellt.

Sie können dann eine Reset() Funktion verwenden, die diese Standardwerte ebenfalls verwendet.

Dies kann sich auch beim Refactoring als etwas einfacher erweisen.


Hier ist, wie Sie Ihre Result Klasse Eigenschaften und Verfahren definieren könnten:

public class Result 
{ 
    private const string defaultMsg = "xxx"; 
    private const bool defaultIsPositive = false; 

    public string Msg { get; set; } = defaultMsg; 
    public bool IsPositive { get; set; } = defaultIsPositive; 

    public void Reset() 
    { 
     Msg = defaultMsg; 
     IsPositive = defaultIsPositive; 
    } 
} 

Beachten Sie, dass die public string Msg { get; set; } = defaultMsg; ist eine schöne Kurz Hand Art und Weise die Eigenschaft der Initialisierung (ich glaube, es ist nur von C# verfügbar 6.0).

könnte andere Möglichkeit, dies durch den Konstruktor zu tun, etwa so:

public Result() 
{ 
    Msg = defaultMsg; 
    IsPositive = defaultIsPositive; 
} 

Dann ist es so einfach, mit ihm das Erstellen Sie das Objekt, zu tun, was zu konsumieren; und dann den Aufruf der Reset() Methode:

// create a Result object with its default values 
var result = new Result(); 

// OR 

// create a Result object with some non-default values 
var result = new Result { Msg = "something", IsPositive = true }; 

Dann, manipulieren oder tun, was man will, mit Ihrem result Objekt.

Dann die Werte zurück:

... // do whatever with your result object 

// reset the result to its default values 
result.Reset();