Laden...

Was genau passiert, wenn mehrere Methoden mit einem "." hintereinander aufgerufen werden?

Erstellt von mchrd vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.248 Views
M
mchrd Themenstarter:in
17 Beiträge seit 2018
vor 5 Jahren
Was genau passiert, wenn mehrere Methoden mit einem "." hintereinander aufgerufen werden?

Hallo zusammen,

ich habe eine Verständnisfrage.


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


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.


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!

16.806 Beiträge seit 2008
vor 5 Jahren

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.

M
mchrd Themenstarter:in
17 Beiträge seit 2018
vor 5 Jahren

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!

C
2.121 Beiträge seit 2010
vor 5 Jahren

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.

T
2.219 Beiträge seit 2008
vor 5 Jahren

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


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

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.