| Autor |
Beitrag |
miniC#
      
Beiträge: 75
Wiin XP Home
C# VS Express 2008
|
Verfasst: Mo 24.11.08 16:11
Hallo beisammen, ich mus euch leider mal wieder nerven. Meine heutige Frage bezieht sich auf das Schlüsselwort this. Der prinzipielle Grundgedanke ist mir klar, jedoch in der präzisen Anwendung bin ich etwas unsicher. Mittels this verweist man auf die aktuelle Instanz einer Klasse.
Ich habe bis jetzt immer this verwendet, wenn ich eine komplette Instanz einer Klasse übergeben wollte. Das klappt auch soweit gut. Meine Frage ist nun inwieweit unterscheiden sich nun folgende Codeblöcke ?
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| public class foo { private string _str;
public void SetStr(string str) { _str = str; } } |
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| public class foo { private string _str;
public void SetStr(string str) { this._str = str; } } |
Ich versteh einfach nicht den Unterschied, da ich dachte, dass nichtstatische Member sowieso immer an eine Klasseninstanz gebunden sind ?
Gruß und Dank
MiniC#
_________________ Zitat MDSN : " ... C# (gesprochen: "si scharp") "
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 24.11.08 16:18
In diesem Fall macht es auch keinen Unterschied, aber was wenn deine private Variable keinen Unterstrich hätte, dann würde der Compiler annehmen, dass du die am nahesten deklarierte Variable meinst. Und das wäre der Parameter. C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| public class foo { private string str;
public void SetStr(string str) { this.str = str; } } | So ist dann klar, dass du die Membervariable der Klasse und nicht den Parameter meinst.
Besser ist natürlich in solch einem Fall keine gleichen Bezeichnungen zu verwenden, wenn das möglich ist. Also wie du es hattest  .
|
|
miniC# 
      
Beiträge: 75
Wiin XP Home
C# VS Express 2008
|
Verfasst: Mo 24.11.08 16:41
jaenicke hat folgendes geschrieben : | In diesem Fall macht es auch keinen Unterschied, aber was wenn deine private Variable keinen Unterstrich hätte, dann würde der Compiler annehmen, dass du die am nahesten deklarierte Variable meinst. Und das wäre der Parameter.
[...]
Besser ist natürlich in solch einem Fall keine gleichen Bezeichnungen zu verwenden, wenn das möglich ist. Also wie du es hattest . |
Hi, zunächst vielen Dank für Deine Antwort. Das Beispiel mit den ausgeblendeten Bezeichnern habe ich auch schon auf MDSN gesehen. Ich kapier trotzdem immer noch net, warum man mit this auf die Member einer Klasse zugreifen kann. This kann man nur aus der instzanierden Klasse herraus verwenden, aber die Member sind idr sowieso an die Instanz gebunden und sind sie es nicht , so möchte man dies idr auch  . Könnte mir jemand eventuell mal einen Link posten für eine sinnvolle Verwendung von this.xyz ? Mdsn und Gali OpenBook kreisen nämlich beide nur um jenes Beispiel der verdeckten Bezeichner. Verzeiht meine Penetranz, aber ich hab das ungute Gefühl, dass ich mal wieder was Grundlegendes nicht verstanden habe  .
Gruß und Dank,
Euer MiniC#
_________________ Zitat MDSN : " ... C# (gesprochen: "si scharp") "
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 24.11.08 16:45
Zum Beispiel sowas:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| class Foo { private List<Foo> children; private void AddChild(Foo aFoo) { children.Add(aFoo); }
private Foo parent; public Foo(Foo aParent) { parent = aParent; parent.AddChild(this); } } |
Du kannst damit die "eigene" Instanz als Parameter übergeben.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
miniC# 
      
Beiträge: 75
Wiin XP Home
C# VS Express 2008
|
Verfasst: Mo 24.11.08 17:04
Hallo,
das Beispiel bzw diese Verwendungsweise kenne ich ja bereits, bzw ist das, was ich mit :
| Zitat: | | Ich habe bis jetzt immer this verwendet, wenn ich eine komplette Instanz einer Klasse übergeben wollte. |
Asche auf mein sich unpräzise ausdrückendes Haupt. Ich nehm mal langsam an es gibt keineen sinnvollen Verwendungszweck auf Member einer Klasse
mittels this zuzugreifen , ausser man hat eben jenes Problem mit ausgeblendeten Bezeichnern ?
ps : zur sicherheit , dein beispiel ist doch von der funktion im groben identisch zu www.c-sharp-forum.de....php?p=532742#532742
oder habe ich da etwas nicht ganz richtig verstanden.
gruß und dank,
miniC#
_________________ Zitat MDSN : " ... C# (gesprochen: "si scharp") "
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Mo 24.11.08 19:02
miniC# hat folgendes geschrieben : | Ich nehm mal langsam an es gibt keineen sinnvollen Verwendungszweck auf Member einer Klasse
mittels this zuzugreifen , ausser man hat eben jenes Problem mit ausgeblendeten Bezeichnern ? |
Manche Coding Styles schreiben die Benutzung von this vor, damit sofort erkennbar ist, ob man auf eine lokale Variable/einen Parameter oder einen Member der Instanz zugreift. Spätestens im Compiler verschwindet aber jeglicher Unterschied zwischen den beiden Schreibweisen.
Wenn wir schon dabei sind: this taucht noch bei zwei anderen Themen auf:
Constructor Chaining
C#-Quelltext 1: 2:
| public Point(int x, int y) { ... } public Point(int x) : this(x, 0) {} |
und in C# 3.0 bei Extension Methods.
_________________ >λ=
|
|
miniC# 
      
Beiträge: 75
Wiin XP Home
C# VS Express 2008
|
Verfasst: Di 25.11.08 07:37
[quote=" Kha"(535285)] miniC# hat folgendes geschrieben : | Ich nehm mal langsam an es gibt keineen sinnvollen Verwendungszweck
Wenn wir schon dabei sind: this taucht noch bei zwei anderen Themen auf:
Constructor Chaining
C#-Quelltext 1: 2:
| public Point(int x, int y) { ... } public Point(int x) : this(x, 0) {} |
und in C# 3.0 bei Extension Methods. |
Dieses this Folgethema habe ich schon auf MDSN entdeckt, aber das ist für meinen momentanen noch recht bescheidenen Wissensstand etwas zuviel. Vielen Dank nochmals für die mal wieder umfangreiche Hilfe an alle, ich denke die Frage ist beantwortet
Gruß, miniC#
_________________ Zitat MDSN : " ... C# (gesprochen: "si scharp") "
|
|
|