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
Der größte Unterschied ist, dass Du i.d.R. die Übersicht verlierst, wenn Du auf die Variablen verzichtest.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Und keinen Breakpoint im Debugger auf den Rückgabewert der Methode setzen kannst.
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.
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
@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)
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... 😄
Es ist doch nur ein Beispiel und man könnte genauso auch
private int GetInt() => MeineListe.Count();
schreiben, oder jede beliebige andere Berechnung.
ThomasE. ging es wohl um die Schreibweise an sich.
Das ist einfach Syntaxzucker, original würde es so aussehen:
private int GetInt()
{
return 6;
}
=)
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)
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... 😄
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.
@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.
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)