In einigen C# -Code Ich habe staments so gesehen:Warum sollten wir Literale in C# verwenden?
float someFloat = 57f;
Ich möchte wissen, warum wir Literale wie f
im obigen Fall nutzen sollte ?.
In einigen C# -Code Ich habe staments so gesehen:Warum sollten wir Literale in C# verwenden?
float someFloat = 57f;
Ich möchte wissen, warum wir Literale wie f
im obigen Fall nutzen sollte ?.
Das „f“ oben ist eine Art Suffix. Dies teilt dem Compiler den genauen Typ des bereitgestellten Literals mit. Dies wird verwendet, damit der Compiler die richtige Speichermenge (Genauigkeit) für das Literal zuweisen kann. Float-Literale erhalten standardmäßig Speicherplatz für ein "Double". Wenn Sie "f" als Suffix hinzufügen, erhält das Literal nur den Speicher für einen Gleitkommawert, der weniger genau ist.
double d = 50.1234; // given double storage
double d = 50.1234f; // given float storage, which might lose precision compared to double
Hauptsächlich so dass der Compiler weiß genau, was wir meinen - insbesondere für die Überladungsauflösung:
Foo(57f);
sollte dieser Anruf Foo(int)
/Foo(float)
/Foo(decimal)
?
Eigentlich mag ich nicht Dinge zu erinnern - eine Alternative ist:
float someFloat = (float)57;
dies nicht eine Laufzeit Guss - es identisch ist (bei der IL-Ebene) zu 57f
. Das einzige Mal, es auf subtile Weise anders ist, ist mit decimal
s mit extra Präzision:
decimal someDecimal = (decimal)57.0; // same as 57M, not 57.0M (scale is different)
Standardmäßig wird ein reelles numerisches Literal auf der rechten Seite des Zuweisungsoperators als doppelt behandelt. Daher zu initialisieren, ein float-Variable die Suffix f oder F verwendet zum Beispiel:
float x = 3.5F;
Wenn Sie nicht das Suffix in der vorherige Erklärung verwenden, erhalten Sie einen Kompilierungsfehler erhalten, weil Sie ein versuchen, zu speichern, double-Wert in eine float-Variable.
Von MSDN: float
Da 57 eine ganze Zahl und 57.0 ist eine doppelte. Sie versuchen, einen Gleitkommawert zu erhalten, der eine Zahl mit einfacher Genauigkeit ist. Das wirft die Frage auf, warum verwenden Sie einen einzelnen Präzisionsschwimmer?
Weitere Informationen zu C# -Literalen finden Sie unter http://www.blackwasp.co.uk/CSharpNumericLiterals.aspx.
Schauen Sie sich diesen Artikel, der viel über Zahlenliterale in C#, erklärt: http://www.blackwasp.co.uk/CSharpNumericLiterals.aspx
Hier ist ein kleiner Auszug aus dem Artikel:
float unitprice = 123,45; // Diese kompilieren nicht
Das Problem hier ist, dass man nicht implizit immer ein doppeltes (123,45) in einen Schwimmer konvertieren.Der C# -Compiler versteht dies und stoppt den Code von
kompilierten
Ich möchte wissen, warum wir Literale wie f im obigen Fall nutzen sollte ?.
Sie sollten nicht. Nun, Sie haben keine zu.
Der obige Fall zeigt eine Float-Initialisierung für 57f. Ganzzahlen werden implizit in die Kompilierungszeit für Floats konvertiert, sodass Sie das f-Suffix einfach entfernen können, wenn Sie das stört. Aus Gründen der Konsistenz im geschriebenen Code versuche ich jedoch immer, das Suffix hinzuzufügen. Beachten Sie, dass dies nur für gerundete Zahlen (Ganzzahlen) gilt.
Warum sollten wir Literale verwenden?
int/int = int
aberint/float = float
:
int timespanInMS = 500;
Console.WriteLine("Execution time: {0} sec.", timespanInMS/1000);
Console.WriteLine("Execution time: {0} sec.", timespanInMS/1000F);
// Result:
// Execution time: 0 sec.
// Execution time: 0.5 sec.