Peter Bucher - Mein Experiment, meine Spielereien, meine Welt...   ·   Stefan Falz   ·   Jürgen Gutsch   ·   Golo Roden   ·   ASP.NET Zone   ·   Microsoft ASP.NET
Willkommen bei ASP.NET Zone. Anmelden | Registrieren | Hilfe

this oder kein this

Am 13. Oktober 2008 haben Golo Roden und ich unter dem Titel Noch Fragen, Roden? Ja, Bucher! angekündigt, jeweils zum ersten eines jeden Monats einen Kommentar zu einem vorab gemeinsam gewählten Thema verfassen zu wollen.

Bisher sind in dieser Reihe folgende Kommentare erschienen:

Heute, am 1. Januar 2010, ist es nun wieder so weit, und unser Thema für diesen Monat lautet:

this oder kein this

So wohl Golo wie auch ich haben uns unabhängig voneinander im Vorfeld unsere Gedanken gemacht, wie wir diesem Thema gegenüberstehen. Golos Kommentar findet sich zeitgleich in seinem Blog, folgend nun mein Kommentar zu diesem Thema.

Generell ist es sinnvoll, wenn ohne weiteres Zutun gleich erfasst werden kann, ob es sich um eine lokale, statische oder instanzbehaftete Variable handelt.
Aus diesem Grund gibt es Konventionen, wie etwas auszusehen hat, sei dies mit Pascal- (fooBar) / Camel-Casing (FooBar) oder durch Prä- / Postfixe (m_foo, foo_m).

Im Allgemeinen hat es sich bei mir so entwickelt, dass ich mich immer mehr zu der empfohlenen Microsoft Konvention hin bewegt habe, was die Einarbeitung in andere Projeke um einiges leichter macht,
da diese Konvention häufig – wenn auch teilweise abgeändert – verwendet wird.

Im aktuellen Streitgespräch geht es darum, ob this verwendet wird / nicht verwendet wird und wo es verwendet wird.

this wird zwanghaft benötigt, um auf die Referenz auf sich selber, in die Hand zu bekommen.
Beispielsweise wenn in einer User-Klasse eine .Save-Methode angeboten wird, die ihrerseits aber einen Service benutzt um sich speichern zu lassen:


public class User
{
    public void Save()
    {
        ServiceLocator
                .Resolve<IUserService>()
                .Save(this);
    }
}

Erweiterungsmethoden benutzen this als Kennzeichnung:


static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
    foreach (var item in source)
    {
        action(item);
    }
}

Bei einer Indexerdeklaration wird this auch benötigt:

public User this[sring index]
{
   get { return this._list[index]; }
   set { this._list[index] = value; }
}

Ein andere Stelle wo this benutzt werden muss, ist beim angeben von zusätzlichen Konstruktoren von sich selbst, die auch noch aufgerufen werden sollen:


public class UserService
{
    private readonly IRepository<User> _userRepository; 

    public UserService() : this(new XmlUserRepository())
    {
       
    }
    public UserService(IRepository<User> userRepository)
    {
         _userRepository = userRepository;
    }
}

Im ersten Konstruktor wird angegeben, das auch der zweite Konstruktor mit einem Parameter aufgerufen werden soll.

Wenn die Instanzvariable “_userRepository” keinen Unterstrich hätte – also “userRepository” – müsste this verwendet werden, damit der Kompiler zwischen Instanzvariable und Argument unterscheiden kann, also:


private readonly IRepository<User> userRepository;
public UserService(IRepository<User> userRepository)
{
    this.userRepository = userRepository;
}

Zu Anfang habe ich das Präfix “_” vor einer Instanzvariable benutzt, so kann man – auch im Intellisense – ohne Probleme auswählen und unterscheiden, da alle schön gruppiert sind.

In Visual Studio 2005 gab es allerdings kein Intellisense bei der Eingabe von “_test” im Code-Editor.
Ich habe dort “this._test” genutzt, denn es ist ja ein Instanzmember und mit der Eingabe von “this.” gab es dann Intellisense.

Ab Visual Studio 2008 gibt es bereits bei der Eingabe von “_” Intellisense, somit wäre “this” überflüssig. Allerdings habe ich mir angewöhnt, this überall anzugeben, wo sich etwas auf die Instanz bezieht.

Also für Methodenaufrufe auf der Instanz (in der Regel protected oder private Methoden), Eigenschaften sowie Instanzfelder.
Es ist so möglich auf den ersten Blick zu unterscheiden und erfassen, was eine lokale Variable ist, was ein statisches Feld / Konstante. Oder doch eine Instanzvariable?.

Was meint ihr dazu?

Veröffentlicht Freitag, 1. Januar 2010 09:37 von Peter Bucher
Abgelegt unter: , ,

Kommentare

# re: this oder kein this

Hallo Peter,

ich war ebenfalls lange Zeit ein vehementer Vertreter von "this" beim Zugriff auf Instanzvariablen und -methoden.

Als ich dann auf myCSharp einen Post von herbivore gelesen habe, der darin schrieb, seiner Meinung nach blähe "this" den Code unnötig auf, habe ich in meinem nächsten Projekt testweise die "_"-Konvention für Instanzvariablen verwendet und ein "this." bei Methodenaufrufen weggelassen. Seitdem halte ich mich an diese Konvention, da sie die Lesbarkeit des Codes deutlich erhöht und diesen "entschlackt". Außerdem finde ich die Gruppierung im IntelliSense extrem hilfreich.

Liebe Grüße,

Marius

Samstag, 1. Mai 2010 11:17 by Marius Schulz
Anonyme Kommentare sind nicht zugelassen