2010-12-15 9 views
2

hat Mit C++ kann ich einen Code wie folgt machen.Übergabe Parameter, der den gleichen Namen der Klassenfeldvariablen in C#

class Terminal { 
    int uid; 

public: 
    void SetUid(int uid) {self.uid = uid;} 
}; 

Ich versuchte die ähnliche Sache in C#, aber ich habe einen Fehler bekommen. Ich habe stattdessen Folgendes versucht, aber es sieht hässlich aus.

Was verwenden Sie, wenn Sie einen Parameter mit dem gleichen Namen der Klassenfeldvariablen in C# übergeben möchten?

Antwort

3
class Terminal { 
    int uid; 

    public void SetUid(int uid) { this.uid = uid; } 
} 

Allerdings würde ich stattdessen eine Eigenschaft in Betracht ziehen:

class Terminal { 
    public int Uid { get; set; } 
} 

Getter und Setter-Methoden in der Regel unsachgemäßer C# Design riechen, da Eigenschaften geben Sie die Getter/Setter-Mechanismus eingewickelt in ein nettes Stück syntaktischen Zucker.

+0

Es gibt einen Vorteil von Getter/Setter-Methoden im Vergleich zu Eigenschaften; Sie können als Stellvertreterreferenzen verwendet werden.Ja, Sie können die Eigenschaft in ein Lambda umwandeln, das wie ein Setter aussieht, aber das beginnt auch zu riechen, da Sie im Grunde eine Methode erstellen, die keinen Wert hinzufügt. – KeithS

+0

@KeithS: Sie können einen Delegaten direkt zum Getter/Setter in reinem IL erstellen. In C# können Sie dies mithilfe von Reflection tun, was nicht zu schlecht ist, wenn Sie den Delegaten wiederverwenden: 'Func getter = (Func ) Delegate.CreateDelegate (typeof (Func ), someTerminalReference, typeof (Terminal) .GetProperty (" Uid "). GetGetMethod());' – cdhowie

+0

... Ich denke, ich hätte lieber das Lambda. All das, gegen() => Uid. Obwohl es dem Call-Stack eine zusätzliche Ebene hinzufügt, wäre es meiner Meinung nach leistungsfähiger und sicherlich einfacher zu lesen. – KeithS

4

Sie können dies tun. Verwenden Sie einfach:

public void SetUid(int uid) { this.uid = uid; } 
2

In C++ ist es nicht self, aber this, und es ist eigentlich das gleiche in C#;

public void SetUid(int uid) 
{ 
    this.uid = uid; 
} 
+0

Ist 'self' nicht von Pascal oder etwas? – Ran

+0

Ich weiß, dass Python 'self' verwendet. Es ist lange genug seit ich Pascal zuletzt benutzt habe, dass ich mich nicht mehr daran erinnern kann, was es benutzt :-) –

1

public void SetUid(int uid) {this.uid = uid;}

2

Wir Parameter nicht die gleiche wie unsere Felder nennen, weil es verwirrend ist. Code wird viel öfter gelesen als geschrieben, daher ist Lesbarkeit von größter Bedeutung. Mental zu entschlüsseln, welches uid der Parameter ist, und welches das Feld ist, ist es einfach nicht wert.

Wir verwenden tatsächlich ein Unterstrichpräfix für unsere Felder, um sofort klar zu machen, was ein Feld ist und was ein Parameter/local ist. Ich weiß, dass nicht jeder diese Konvention mag, aber wir finden es hilfreich.

Darüber hinaus benennen wir für eine SetXxx-Methode, wie Sie gerade schreiben, oft nur den Parameter value, der der Konvention der C# -Eigenschaften-Setter folgt. Da es nur den einen Parameter gibt und Sie bereits wissen, was es aus dem Methodennamen bedeutet, ist "Wert" genauso aussagekräftig wie "uid".

So in unserem Geschäft, würde Ihr Beispiel wahrscheinlich wie dies am Ende aussehen:

public class Terminal { 
    private int _uid; 

    public void SetUid(int value) { 
     _uid = value; 
    } 
} 

das ist vorausgesetzt, dass der uid schreibgeschützt ist. Wenn es read-write wäre, würden wir natürlich eine Eigenschaft anstelle von Getter/Setter-Methoden verwenden.

0

Ich habe mich angewöhnt, Parameter mit "the" voranzustellen, wie in "theUID" oder "the_uid", wenn Sie Unterstriche bevorzugen.

public void SetUID(int theUID) { 
    uid = theUID; 
} 

Dies ist hilfreicher als „Wert“, vor allem, wenn Sie mehrere Parameter haben:

public Actor(String theName, String theFilm) 
{ 
    name = theName; 
    film = theFilm; 
} 

(und ja, habe ich verwendet, verwenden „das.“ Aber es wurde umständlich und Fehler gefunden -prone)

Verwandte Themen