Entwickler-Ecke

C# - Die Sprache - Code Convention: Benutzung von this bei Klassenvariablen


relic - So 02.02.14 13:52
Titel: Code Convention: Benutzung von this bei Klassenvariablen
Hallo zusammen,
ich bin neu hier und arbeite mich gerade in C# ein. In meinem Buch wird beim Zugriff auf die Klassenvariablen nur das this vorangestellt, wenn im Methodenkopf eine Variable mit gleichen Namen übergeben wurde.
Bevor ich mir hier etwas falsches angewöhne wollte ich mal Nachfragen wie hier in C# die Code Convention ist. In meinem Buch wird darauf nicht eingegangen :(

1. Setzt man immer ein this vor die Klassenvariable wie z.Bsp. in Java?
2. Setzt man das this nur davor wenn eine gleichnamige Variable in der Methode übergeben wurde?


Danke und Gruß


Ralf Jansen - So 02.02.14 14:10

2.tens.

Das man das this zur Unterscheidung braucht sollte dir eigentlich nur regelmäßig in Konstruktoren passieren bei der Zuweisung von Parametern an Klassenvariablen. Der Fall das du eine lokale Variable und eine Klassenvariable gleichen Namens hast gehört als solches schon zu schlechtem Stil. Die Frage nach this oder nicht stellt sich dann schon gar nicht mehr.


relic - So 02.02.14 14:24

Danke das beantwortet meine Frage.


Palladin007 - So 02.02.14 19:49

Wir haben eine entsprechende Namens-Konventionen, wo ein this gar nicht nötig ist.

Properties - Groß geschrieben
Globale Felder - klein geschrieben mit voran gesetztem Unterstrich
Methoden - Groß geschrieben, bezeichnet eine Tätigkeit
Variablen im Methoden (auch Parameter) - klein geschrieben, ohne Unterstrich am Anfang

Allgemein Properties/Felder/Variablen sollten einen Namen haben, der den Inhalt als Objekt beschreibt.
Ist der Typ ein Delegat, dann schreibe ich dennoch eine Tätigkeit, wie bei den Methoden, allerdings nicht groß geschrieben. (Außer bei Properties, da setze ich dann sowas wie "Func" ans Ende)
Events enden immer mit "Event" und sind groß geschrieben, dazu eine passende OnEvent-Methode.


So können wir dann immer anhand des Namens erkennen, was das für eine Variable ist, wo sie liegt und - wenn die Benennung gut ist - wofür sie da ist.
Ein this ist dann gar nicht mehr nötig, da die Parameter immer klein geschrieben sind, während alles Andere entweder groß geschrieben oder mit Unterstrich da steht.
Einzige Stelle, wo man es braucht, ist die Konstruktor-Überladung, wo dann eventuell ein anderer Konstruktor aufgerufen wird.

Manchmal kommt auch so die Argumentation auf: Wenn ich das this für einen Aufruf benötige, habe ich irgendetwas falsch benannt. ^^



PS:

Ein Beispiel, was in meinen Augen sauberer Code ist:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
public class Person
{
    private readonly string _name;
    private readonly DateTime _birthday;

    public string Name
    {
        get { return _name; }
    }
    public DateTime Birthday
    {
        get { return _birthday; }
    }

    public Person(string name, DateTime birthday)
    {
        if (string.IsNullOrEmpty(name))
            throw new ArgumentNullException("name");
        if (CalculateAge(birthday) < 0)
            throw new ArgumentException("Your birthday must be in the past.""birthday");

        _name = name;
        _birthday = birthday;
    }

    public int CalculateAge()
    {
        return CalculateAge(Birthday);
    }

    private int CalculateAge(DateTime birthday)
    {
        var years = DateTime.Now.Year - birthday.Year;
        birthday = birthday.AddYears(years);

        if (DateTime.Now.CompareTo(birthday) < 0)
            years--;

        return years;
    }
}