Laden...

Unterschied: Methodenaufruf im Parameter/ Variable im Parameter

Erstellt von genuin vor 7 Jahren Letzter Beitrag vor 7 Jahren 3.311 Views
G
genuin Themenstarter:in
41 Beiträge seit 2014
vor 7 Jahren
Unterschied: Methodenaufruf im Parameter/ Variable im Parameter

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

(NameOfClass.GetSomething())

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

var result = NameOfClass.GetSomething()

und result als Parameter)?

Überleg ich mir noch

16.806 Beiträge seit 2008
vor 7 Jahren

Der größte Unterschied ist, dass Du i.d.R. die Übersicht verlierst, wenn Du auf die Variablen verzichtest.

T
708 Beiträge seit 2008
vor 7 Jahren

Und keinen Breakpoint im Debugger auf den Rückgabewert der Methode setzen kannst.

B
110 Beiträge seit 2008
vor 7 Jahren

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.

16.806 Beiträge seit 2008
vor 7 Jahren

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.

3.003 Beiträge seit 2006
vor 7 Jahren

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


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

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

T
461 Beiträge seit 2013
vor 7 Jahren

Hallo LaTino,

was ist denn das für eine Schreibweise?:


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?

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

D
985 Beiträge seit 2014
vor 7 Jahren

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


private int GetInt() => MeineListe.Count();

schreiben, oder jede beliebige andere Berechnung.

1.040 Beiträge seit 2007
vor 7 Jahren

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

private int GetInt()
{
    return 6;
}

=)

3.003 Beiträge seit 2006
vor 7 Jahren

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.


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

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

T
461 Beiträge seit 2013
vor 7 Jahren

Hey, besten Dank!

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

[Edit1]


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

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

2.078 Beiträge seit 2012
vor 7 Jahren

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.

D
985 Beiträge seit 2014
vor 7 Jahren

@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


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


public int Bar => _data.Value;

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

3.003 Beiträge seit 2006
vor 7 Jahren
  
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:


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

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)