C# Probleme mit This und Methoden?


23.07.2021, 13:26

.

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Das Schlüsselwort this bezieht sich immer auf das Objekt selbst, welches die Methode aufgerufen hat. Eine wirkliche Notwendigkeit, das Schlüsselwort einzusetzen, besteht also nur, falls du das Objekt selbst bspw. an jemanden weitergeben möchtest oder eine Unterscheidung zwischen gleichnamigen Bezeichnern notwendig ist. Ansonsten ist es optional.

Beispiel für Fall A:

class A
{
  public A(B b)
  {
    // ...
  }
}

class B
{
  public void DoSomething()
  {
    A a = new A(this);
    // ...
  }
}

// Main:
B b = new B();
b.DoSomething();

Hier wird this verwendet, um eine Referenz von B an den Konstruktor von A weiterzugeben.

Beispiel für Fall 2:

class Rectangle
{
  private int height;
  private int width;

  public Rectangle(int height, int width)
  {
    this.height = height;
    this.width = width;
  }
}

Lokale Variablen überdecken stets Felder (sowie Properties, u.ä.), wenn sie beide denselben Namen haben. Um im Konstruktor also den Parameterwert von height an das Feld height weiterzugeben, muss das Feld mit this angesprochen werden. Würde dort stattdessen

height = height;

stehen, würde sich der Parameter height seinen eigenen Wert wieder zuordnen, was natürlich nicht sonderlich sinnvoll ist.

Dieses Problem mit gleichnamigen Bezeichnern kann man aber leicht umgehen. Für private Felder gibt es zudem die Konvention, sie mit Unterstrich zu beginnen:

class Rectangle
{
  private int _height;
  private int _width;

  public Rectangle(int height, int width)
  {
    _height = height;
    _width = width;
  }
}

Zu deinem Code:

1) Dort werden Konsolenausgaben vorgenommen. Dafür wird der aktuelle Wert eines Felds mit einem String kontateniert.

Console.WriteLine("Some string ... " + this.someField);

Also angenommen, das Feld (im Snippet) hätte den Wert 5, wäre die Ausgabe:

Some string ... 5

Es verhält sich somit nicht anders, als würdest du eine ganz normale Werttypvariable mit einer Zeichenkette verbinden.

2) Dort handelt es sich um eine Methode, die einen Parameter entgegennimmt. Der Wert des Parameters wird einem Feld zugeordnet.

Beispiel:

class Rectangle
{
  private int height;

  public void SetHeight(int height)
  {
    this.height = height;
  }
}

// Main:
Rectangle rectangle = new Rectangle();
rectangle.SetHeight(25);

Die Set-Methode ermöglicht es, den Wert des Felds height von außerhalb der Klasse mit einem Wert zu belegen. Dieses Prinzip ist Teil des Data-Hiding-Konzepts. Bevor ich darauf aber weiter eingehe, möchte ich ausdrücklich dazu schreiben, dass solche Set-/Get-Methoden in C# nicht üblich sind. Da hat womöglich jemand Java gelernt und nun versucht, sein Wissen von dort auf C# zu adaptieren, ohne sich mit den Sprachelementen von C# auseinanderzusetzen.

Schau dir Properties an (siehe auch in der Dokumentation).

Wenn du Felder durch Properties verwalten lässt, kannst du leichter Filter in deinen Code einbauen, ohne diesen nachträglich an mehreren Stellen wieder ändern zu müssen.

Gezeigt an einem Beispiel:

class Rectangle
{
  public int height;
}

Hier wäre es noch möglich, das Feld von außen leicht zu ändern.

Rectangle rectangle = new Rectangle();
rectangle.height = someHeight;

Nun fällt dir aber nachträglich ein, dass du sicherstellen möchtest, dass ein Rechteck immer größer als 0 sein muss. Nun könntest du anfangen, an jeder Stelle in deinem Projekt, wo du den Wert des Feldes setzt, eine Anfrage einzubauen:

Rectangle rectangle = new Rectangle();

if (someHeight > 0)
{
  rectangle.height = someHeight;
}

Das sorgt aber auch dafür, dass dein Code stetig anwächst und wenn du eine Stelle vergisst, hast du schon einen Fehler im Code.

Mit einem Property sorgst du für eine Entkopplung, die dieses Problem verhindert:

class Rectangle
{
  private int _height;

  public int Height
  {
    get => _height;
    set
    {
      if (value > 0)
      {
        _height = height;
      }
    }
  }
}

Wenn du nun von außen mit dem Wert des Feldes agieren möchtest, machst du das über das Property:

Rectangle rectangle = new Rectangle();
rectangle.Height = someHeight;
Frizan 
Fragesteller
 23.07.2021, 14:43

Dankeschön für die Mühen:) hat mir sehr geholfen

0

meiner meinung nach muss man in diesen fällen nicht das "this" schlüsselwort verwenden. "this" benötigst du z.b. zum unterscheiden, wenn du in den methoden, variablen verwendest, die identisch benamst sind, wie die attribute von der jeweiligen klasse.