Lukaspojken skrev:
Varför tror du ReSharper ser this som redundant? Jag tror respharper också reagerar på att om du inte använder dig av _-tecknet för privata variabler. Så det borde lösa problemet du tar upp.
För att det till viss del är det. 'this' måste ju användas i vissa fall, som vid överskuggning av variabler, för att skicka en referens till sig själv som parameter till någon metod, osv.
class MyClass {
private int volume;
...
public MyClass GenerateFromVolume(int volume) {
if(this.volume > volume)
return this;
else
return new MyClass(volume);
}
...
}
I den ovanstående (inte så logiska) kodsnutten är man tvungen till att använda referensen this. I if-jämförelsen för överskuggningen och i raden under för att returnera referensen till sig själv. Det finns ingen annan väg att gå (förutom att döpa om parametern möjligtvis).
class Quadrant {
private int baseline;
private int height;
...
public Quadrant CreateQuadrantFromHeight(int height) {
return new Quadrant(this.baseline, height);
}
...
}
I den här koden är this redundant. Den är helt onödig, eftersom att det inte finns någon annan variabel med namnet 'baseline'. Dock så, enligt mig, ökar den förståelsen för koden - jag förstår direkt (och hoppas att andra gör det också) att det är baslinjen för instansen som ska användas. Det går inte att ta miste på.
ReSharper hade antagligen gillat den övre koden bättre än den undre, där den hade plockat bort referensen till this. Men bara för att ReSharper gör det, tycker jag inte att man ska ta det som att man inte ska använda this. Microsoft Base Class Usage Guidelines hävdar till exempel att man bör använda this för de flesta (alla?) instansvariabler/-referenser. Microsoft StyleCop råder en också att använda this. Så varför lyssna på vad ReSharper säger, när andra verktyg säger motsatsen? :)
Alla programmerare har sin egen stil - gillar du understreck och alla i ditt företag är överens om er namnstandard, kör på det!
Jag ger ytterligare ett kodexempel att grunna på:
class MyClass {
...
public void DoSomething() {
/* Gör något roligt här */
this.DoSomethingElse();
}
...
}
Jämför mot:
class MyClass {
...
public void DoSomething() {
/* Gör något roligt här */
DoSomethingElse();
}
...
}
I det övre exemplet här är this verkligen redundant. Om man utelämnade this och gör direkt som i andra exemplet, så förstår man ändå direkt att det är en metod i den lokala instansen - det finns ingen annan möjlighet. Det kan ju inte vara en metod på ett annat objekt. Här förespråkar jag metod 2, alltså att man utelämnar själv-referensen.
(För övrigt säger också Microsoft User Guidelines att man inte ska deklarera instansfält som publika - utan att man ska gå via proppar ;))