myCSharp.de - DIE C# und .NET Community (https://www.mycsharp.de/wbb2/index.php)
- Entwicklung (https://www.mycsharp.de/wbb2/board.php?boardid=3)
-- Grundlagen von C# (https://www.mycsharp.de/wbb2/board.php?boardid=88)
--- Was genau passiert, wenn mehrere Methoden mit einem "." hintereinander aufgerufen werden? (https://www.mycsharp.de/wbb2/thread.php?threadid=121208)


Geschrieben von mchrd am 27.10.2018 um 17:20:
  Was genau passiert, wenn mehrere Methoden mit einem "." hintereinander aufgerufen werden?
Hallo zusammen,

ich habe eine Verständnisfrage.

C#-Code:
public class Beispiel
{
        public int AuthorId { get; set; }
        public string Vorname{ get; set; }
        public string Nachname{ get; set; }

        public void Testfunktion1()
        {
                Console.WriteLine("Testfunktion 1 wurde aufgerufen");
        }

        public void Testfunktion2()
        {
                Console.WriteLine("Testfunktion 2 wurde aufgerufen");
        }

        public void Testfunktion3()
        {
                Console.WriteLine("Testfunktion 3 wurde aufgerufen");
        }
}


var test = new Beispiel();
test.Testfunktion1(); // würde "Testfunktion 1 wurde aufgerufen" ausgeben.
test.Testfunktion3(); // würde "Testfunktion 3 wurde aufgerufen" ausgeben.

Der Punkt dient in diesem Fall dazu, auf Eigenschaften oder Funktionen eines Objektes zuzugreifen. Jetzt habe ich aber schon Beispiele gesehen, bei denen mehrere Funktionen aufgerufen werden und mit einem Punkt getrennt sind. Ich kann mir nicht vorstellen, was dort genau passiert?!? Könnt ihr mir ggf. den Hintergrund an einem einfachen Beispiel erklären?

Beispielhaft aufgefallen ist mir das beim Entity Framework Core (wenn man m:n Relationen abbilden möchte), dann würde man u. A. folgendes

C#-Code:
modelBuilder.Entity<BookCategory>()
        .HasOne(bc => bc.Book)
        .WithMany(b => b.BookCategories)
        .HasForeignKey(bc => bc.BookId);

Quelle:  https://www.learnentityframeworkcore.com/configuration/many-to-many-relationship-configuration

schreiben.

Was passiert hier? Es wird bei der Klasse "modelBuilder" die Funktion Entity<BookCategory>() aufgerufen. Dies scheint eine generische Funktion zu sein, da dort ein Typ "BookCategory" übergeben wird. Jedoch werden dann noch zwei weitere Funktionen mit einem Punkt aufgerufen. Die WithMany und HasForeignKey.

Wenn ich jetzt ein Ergebnis einer Funktion an eine andere übergeben lassen möchte und diese hinteinander etwas abarbeiten würde ich es so schachteln.

C#-Code:
Console.WriteLine(FunktionA(FunktionB(FunktionC(3)))));

In diesem Fall würde der Funktion 3 eine 3 übergeben werden. Alle 3 Funktionen geben wieder ein Int zurück und führen irgendeine Berechnung durch. Dann würde das Ergebnis von FunktionC an FunktionB übergeben werden. Diese berechnet etwas und übergibt das Ergebnis an Funktion A. Auch diese macht etwas und das Ergebnis wird dann an Console.WriteLine übergeben welches das Ergebnis anzeigt.

Habt ihr ggf. Links für mich oder einen Fachbegriff,, so dass ich dies besser suchen und verstehen kann, was mit diesen vielen Punkten gemacht wird bzw. wie so eine Klasse mit Funktionen aufgebaut sein kann?

Danke für eure Hilfe!


Geschrieben von Abt am 27.10.2018 um 17:23:
 
Bezogen auf das Entity Framework; das nennt sich Fluent Interface bzw. Method Chaining.
Findest genug unter Google dazu mit entsprechenden Beispielen.

Und Deine ineinander agierende Methoden (Funktionen sind etwas anderes); da willst Du wohl auf den Decorator Pattern hinaus.


Geschrieben von mchrd am 27.10.2018 um 17:42:
 
Zitat von Abt:
Fluent Interface bzw. Method Chaining.

Decorator Pattern

Vielen Dank für die schnelle Antwort! Jetzt bin ich auch fündig geworden, dank der richtigen Schlagworte von dir!


Geschrieben von chilic am 28.10.2018 um 08:49:
 
Bildlich gesehen gibt eine Methode gern mal ein Objekt zurück. Dieses Objekt hat wieder andere Methoden die auch wieder ein Objekt zurückgeben. Dieses hat wieder Methoden....
Statt jedes Objekt erst in eine Variable zu packen und dann eine neue Methode aufzurufen kann man auch direkt Methoden aneinanderhängen.


Geschrieben von T-Virus am 28.10.2018 um 09:13:
 
Ein Beispiel dafür ist z.B. der StringBuilder.
Dieser gibt bei den Append* Methoden die Referenz auf sich selbst(this) zurück.
Damit kann man mehrere Aufrufe direkt mit dem Rückgabewert verknüpfen.
Ist beim StringBuilder auch sehr praktisch, wenn man z.B. einen Text aus Teilen eines anderen Objekts Zeilenweise zusammensetzen muss.
So kann man die ganzen Methoden auch im Code direkt hintereinander setzen

C#-Code:
StringBuilder builder = new StringBuilder();

builder
    .AppendLine("Zeile 1")
    .AppendLine("Zeile 2")
    .AppendLine("Zeile 3")
    .AppendLine("Zeile 4")
    .AppendLine("Zeile 5");

Console.Write(builder.ToString());

T-Virus


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 06.12.2019 21:33