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# » Unterschied: Methodenaufruf im Parameter/ Variable im Parameter
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Unterschied: Methodenaufruf im Parameter/ Variable im Parameter

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

Dabei seit: 04.08.2014
Beiträge: 41
Entwicklungsumgebung: Visual Studio 2015
Herkunft: Erlangen


genuin ist offline

Unterschied: Methodenaufruf im Parameter/ Variable im Parameter

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

Hi!

Ich habe eine Methode, sagen wir mal Execute, die im asynchronen Modus läuft. Diese Methode hat mehrere Parameter.

Macht es einen Unterschied, ob ich dieser Methode mit mehreren Parametern eine Methode übergebe

C#-Code:
(NameOfClass.GetSomething())

oder anstatt der Methode eine Variable deklariere und diese dann der Methode mit mehreren Parametern übergebe (also

C#-Code:
var result = NameOfClass.GetSomething()

und result als Parameter)?

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von genuin am 18.01.2017 08:27.

18.01.2017 07:52 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


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


Abt ist offline

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

Der größte Unterschied ist, dass Du i.d.R. die Übersicht verlierst, wenn Du auf die Variablen verzichtest.
18.01.2017 09:32 Beiträge des Benutzers | zu Buddylist hinzufügen
trib trib ist männlich
myCSharp.de-Mitglied

Dabei seit: 22.04.2008
Beiträge: 663
Entwicklungsumgebung: C#


trib ist offline

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

Und keinen Breakpoint im Debugger auf den Rückgabewert der Methode setzen kannst.
18.01.2017 09:44 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
bb1898 bb1898 ist weiblich
myCSharp.de-Mitglied

Dabei seit: 31.03.2008
Beiträge: 110
Entwicklungsumgebung: VS 2015 Community / PostgreSQL


bb1898 ist offline

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

Ich weiß, der Thread ist nicht mehr druckfrisch, aber im Hinblick auf spätere Leser:
Du übergibst in keinem Fall eine Methode als Parameter; die hätte einen ganz anderen Datentyp. Du übergibst jedesmal das Ergebnis eines Methodenaufrufs, nur gibst Du dem einmal einen eigenen Namen, einmal nicht. Die Vorteile des ersten Vorgehens wurden schon genannt.
30.01.2017 17:51 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


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


Abt ist offline

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

Das macht in der Runtime keinen Unterschied bb1898, wenn die Variable ansonsten nicht verwendet wird.
IIRC müsste Aggressive Inlining eine entsprechende Optimierung durchführen, sodass im ILCode kein Unterschied existiert.
30.01.2017 18:45 Beiträge des Benutzers | zu Buddylist hinzufügen
LaTino LaTino ist männlich
myCSharp.de-Poweruser/ Experte

avatar-4122.png


Dabei seit: 03.04.2006
Beiträge: 2.988
Entwicklungsumgebung: Rider / VS2019 / VS Code
Herkunft: Thüringen


LaTino ist offline

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

@Abt, ich glaube, es geht bb1898 vielmehr darum:

C#-Code:
private int GetInt() => 6;

DoThis(GetInt, 25);
DoThat(GetInt(), 25);

abstract void DoThis(Func<int> firstParameter, int secondParameter);
abstract void DoThat(int firstParameter, int secondParameter);

In dem Fall (ersterer) würde man aber von einem Delegaten sprechen. Insofern sehe ich da nicht die Verwechslungsgefahr, eher die Gefahr, den TE völlig unnötig zu verwirren.

LaTino
31.01.2017 07:40 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ThomasE. ThomasE. ist männlich
myCSharp.de-Mitglied

avatar-178.gif


Dabei seit: 26.11.2013
Beiträge: 446
Entwicklungsumgebung: Visual Studio 2015Pro/2017Ent


ThomasE. ist offline

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

Hallo LaTino,

was ist denn das für eine Schreibweise?:

C#-Code:
private int GetInt() => 6;

Kenn ich gar nit!

Heißt das, daß diese Methode immer 6 zurückliefert?
Was hätte das für einen Sinn?
31.01.2017 08:37 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Deaktiviertes Profil Deaktiviertes Profil ist männlich
myCSharp.de-Mitglied

Dabei seit: 06.07.2014
Beiträge: 985


Deaktiviertes Profil ist offline

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

Es ist doch nur ein Beispiel und man könnte genauso auch

C#-Code:
private int GetInt() => MeineListe.Count();

schreiben, oder jede beliebige andere Berechnung.
31.01.2017 09:35 Beiträge des Benutzers | zu Buddylist hinzufügen
p!lle
myCSharp.de-Mitglied

avatar-3556.jpg


Dabei seit: 22.02.2007
Beiträge: 1.031
Entwicklungsumgebung: Visual Studio (Community) 2017


p!lle ist offline

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

ThomasE. ging es wohl um die Schreibweise an sich.
Das ist einfach Syntaxzucker, original würde es so aussehen:

C#-Code:
private int GetInt()
{
    return 6;
}

fröhlich
31.01.2017 10:02 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
LaTino LaTino ist männlich
myCSharp.de-Poweruser/ Experte

avatar-4122.png


Dabei seit: 03.04.2006
Beiträge: 2.988
Entwicklungsumgebung: Rider / VS2019 / VS Code
Herkunft: Thüringen


LaTino ist offline

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

Was Sir Rufo sagt. Ich wollte nur das Coderauschen (alles, was nicht relevant fürs Beispiel ist) gering halten. Die Schreibweise ist ab C# 6.0 (Visual Studio 2015) im Sprachstandard.

C#-Code:
public string FormatAsShortDate(DateTime example) => example.ToString("d");
//ist dasselbe wie:
public string FormatAsShortDate(DateTime example)
{
    return example.ToString("d");
}

public int CalculatedBmi => Mass / (Height * Height);
//ist dasselbe wie:
public int CalculatedBmi
{
   get
   {
        return Mass / (Height * Height);
    }
}

LaTino
31.01.2017 10:04 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ThomasE. ThomasE. ist männlich
myCSharp.de-Mitglied

avatar-178.gif


Dabei seit: 26.11.2013
Beiträge: 446
Entwicklungsumgebung: Visual Studio 2015Pro/2017Ent


ThomasE. ist offline

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

Hey, besten Dank!

Das hat natürlich so seine Feinheiten und spart auch wieder platz, finde das toll!

[Edit1]

C#-Code:
public int CalculatedBmi => Mass / (Height * Height);
//ist dasselbe wie:
public int CalculatedBmi
{
   get
   {
        return Mass / (Height * Height);
    }
}

Mit dieser Schreibweise ist aber nur ein getter möglich?

[/Edit1]

Grüße

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ThomasE. am 31.01.2017 12:36.

31.01.2017 12:33 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Palladin007 Palladin007 ist männlich
myCSharp.de-Mitglied

Dabei seit: 03.02.2012
Beiträge: 1.226
Entwicklungsumgebung: Visual Studio 2017
Herkunft: NRW


Palladin007 ist offline

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

Ja, nur Getter.

Wirklich toll finde ich das allerdings nicht.
Das würde sich vermutlich lohnen, wenn man z.B. zig Operatoren mit entsprechenden Methoden überladen will.
Bei einer Property sehe ich aber in erster Linie die Gefahr, dass die Bedeutung unter geht.
Da gibt's dann nämlich nur noch ein Zeichen Unterschied zur Feld-Zuweisung, es ist nicht mehr direkt sichtbar, dass es sich um eine Property handelt.
Außerdem wird der gesamte Code deutlich unordentlicher, weil man Methode sowie Property nicht mehr zu klappen kann, sondern der Code quer durch die Datei direkt ins Auge springt.
31.01.2017 13:39 Beiträge des Benutzers | zu Buddylist hinzufügen
Deaktiviertes Profil Deaktiviertes Profil ist männlich
myCSharp.de-Mitglied

Dabei seit: 06.07.2014
Beiträge: 985


Deaktiviertes Profil ist offline

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

@Palladin007

Das ist aber auch Geschmackssache und gehört in die Style-Vorschriften des Teams ob so etwas erlaubt ist oder nicht. Nur weil es geht muss man es nicht benutzen.

Ich verwende diese Schreibweise auch nicht zwanghaft, sondern nur dann wenn es mir gefällt -> die Lesbarkeit des Codes darunter nicht leidet.

So etwas

C#-Code:
public int Foo => _whatever.Items.Where( f => f.Name == "bar" ).Select( ... ).GroupBy( ... ).Count() / _anyother.Where( ... ).Count() * _magicNumber;

würde ich immer in der herkömmlichen Art deklarieren, denn das kann kein Mensch vernünftig lesen.

Das hier

C#-Code:
public int Bar => _data.Value;

ist aber kurz und knapp und IMHO sehr gut lesbar und darum darf das dann bleiben.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Deaktiviertes Profil am 31.01.2017 14:10.

31.01.2017 14:08 Beiträge des Benutzers | zu Buddylist hinzufügen
LaTino LaTino ist männlich
myCSharp.de-Poweruser/ Experte

avatar-4122.png


Dabei seit: 03.04.2006
Beiträge: 2.988
Entwicklungsumgebung: Rider / VS2019 / VS Code
Herkunft: Thüringen


LaTino ist offline

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

Zitat von Sir Rufo:
C#-Code:
public int Bar => _data.Value;

ist aber kurz und knapp und IMHO sehr gut lesbar und darum darf das dann bleiben.

Jupp. Ich würde behaupten wollen, der Hauptgedanke dahinter war tatsächlich, wrapping zu erleichtern. Zum Beispiel so ein Konstrukt hier, was in der Art hin und wieder mal vorkommen kann:

C#-Code:
public class WrappingList<T> : IList<T>
{
    private readonly List<T> _internalList;

    #region IList-Implementierung
     public IEnumerator<T> GetEnumerator() => _internalList.GetEnumerator();
     IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();

     //..usw usf.

    #endregion
}

Verringert den Tippaufwand einfach enorm und zeigt beim Lesen auch gleich an: "Achtung, nur ein Wrapper, bitte weitergehen, hier ist nichts interessantes!".

Ansonsten ist es eh' nur für Einzeiler geeignet. Wenn es da zu unübersichtlich wird, sollte man an seinem Stil arbeiten.

LaTino
31.01.2017 15:39 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 3 Jahre.
Der letzte Beitrag ist älter als 3 Jahre.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 30.03.2020 11:22