Autor Beitrag
miniC#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75

Wiin XP Home
C# VS Express 2008
BeitragVerfasst: 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 ?

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
public class foo
{
    private string _str;

    public void SetStr(string str)
    {
        _str = str;
    }
}



ausblenden 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") " :D
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.
ausblenden 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# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75

Wiin XP Home
C# VS Express 2008
BeitragVerfasst: Mo 24.11.08 16:41 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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") " :D
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 24.11.08 16:45 
Zum Beispiel sowas:

ausblenden 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# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75

Wiin XP Home
C# VS Express 2008
BeitragVerfasst: 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") " :D
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 24.11.08 19:02 
user profile iconminiC# hat folgendes geschrieben Zum zitierten Posting springen:
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
ausblenden 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# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75

Wiin XP Home
C# VS Express 2008
BeitragVerfasst: Di 25.11.08 07:37 
[quote="user profile iconKha"(535285)]
user profile iconminiC# hat folgendes geschrieben Zum zitierten Posting springen:
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
ausblenden 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") " :D