myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Grundlagen von C# » Was genau passiert, wenn mehrere Methoden mit einem "." hintereinander aufgerufen werden?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

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

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
mchrd mchrd ist männlich
myCSharp.de-Mitglied

avatar-229.gif


Dabei seit: 27.10.2018
Beiträge: 17
Entwicklungsumgebung: Visual Studio 2017, VS Code


mchrd ist offline

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

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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...p-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!
27.10.2018 17:20 Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.262
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
27.10.2018 17:23 Beiträge des Benutzers | zu Buddylist hinzufügen
mchrd mchrd ist männlich
myCSharp.de-Mitglied

avatar-229.gif


Dabei seit: 27.10.2018
Beiträge: 17
Entwicklungsumgebung: Visual Studio 2017, VS Code

Themenstarter Thema begonnen von mchrd

mchrd ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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!
27.10.2018 17:42 Beiträge des Benutzers | zu Buddylist hinzufügen
chilic
myCSharp.de-Poweruser/ Experte

Dabei seit: 12.02.2010
Beiträge: 2.018


chilic ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
28.10.2018 08:49 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.366
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
28.10.2018 09:13 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als ein Jahr.
Der letzte Beitrag ist älter als ein Jahr.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 15.12.2019 04:23