2008-10-03 14 views
30

Czy ktoś zna pełną listę modyfikatorów literowych liczby kompilatorów C#?C# liczba literówek kompilatora

Domyślnie zadeklarowanie "0" powoduje, że jest to Int32, a "0.0" powoduje, że jest to "Double". Mogę użyć literalnego modyfikatora "f" na końcu, aby upewnić się, że coś jest traktowane jako "Single". Na przykład tak ...

var x = 0; // x is Int32 
var y = 0f; // y is Single 

Jakie inne modyfikatory mogę użyć? Czy istnieje jeden wymuszający na Double, Decimal, UInt32? Próbowałem googlować, ale nie mogłem nic znaleźć. Może moja terminologia jest zła i to wyjaśnia, dlaczego jestem pusta. Każda pomoc doceniona.

Odpowiedz

49
var y = 0f; // y is single 
var z = 0d; // z is double 
var r = 0m; // r is decimal 
var i = 0U; // i is unsigned int 
var j = 0L; // j is long (note capital L for clarity) 
var k = 0UL; // k is unsigned long (note capital L for clarity) 

Z C# specification 2.4.4.2 i 2.4.4.3 literałów Integer prawdziwych literałów. Zwróć uwagę, że preferowane są L i UL, w przeciwieństwie do ich małych liter, dla zachowania przejrzystości, zgodnie z zaleceniami Jon Skeet.

+14

Podczas gdy l jest na pewno ważny dla długich, polecam użycie L zamiast - to jest tak samo ważne i nie wygląda jak "1" –

+2

@ Jon Skeet: zły nawyk programisty C, dodał twoją radę. – user7116

5

Może chcesz zacząć od looking at the C# language spec. Większość typów wymienionych tam, i sufiks:

  • L = długa
  • F = unosić
  • U = uint
  • ULong na to little different
  • M = dziesiętna (pieniądze)
  • D = podwójny

oczywiście, jeśli zaprzestać używania var następnie dostać się wokół całego problemu, a kod staje się bardziej czytelny (ok, to jest subiektywne, ale na coś takiego, to bardziej czytelne dla innych osób:

var x = 0; //whats x? 
float x = 0; //oh, it's a float 
byte x = 0; // or not! 
+0

@Nic Wise: +1 stop przy użyciu var; D Chociaż upraszcza pokazywanie, który sufiks dotyczy danego typu. – user7116

+0

tak, bardzo dobry punkt :) Lubię var w ogóle, szczególnie w instrukcjach foreach (foreach (var a in myList)), ale poza tym nie jestem wielkim fanem. –

11

Jeśli nie chcemy mieć do zapamiętaj je, a następnie kompilator zaakceptuje obsadę w tym samym celu (możesz sprawdzić IL, że efekt jest taki sam - tzn. kompilator, a nie środowisko wykonawcze, obsada). Aby pożyczyć wcześniejszy przykład:

var y = (float)0; // y is single 
    var z = (double)0; // z is double 
    var r = (decimal)0; // r is decimal 
    var i = (uint)0; // i is unsigned int 
    var j = (long)0; // j is long 
    var k = (ulong)0; // k is unsigned long 

Co do zapisu, zgadzam się, że "var" jest złym wyborem; Z chęcią użyję var dla SortedDictionary < SomeLongType, SomeOtherLongType >, ale dla "int" jest po prostu leniwy ...

+0

@Marc Gravell: +1 dobra rada przy użyciu obsady, ale czasami trzeba użyć przyrostka (np. Zły przykład, 3.14159m). Osobiście używam obsady, gdy chcę być bezpośredni. – user7116

+0

Kompilator traktuje tak samo; czy masz przykład, który robi różnicę? var x = 3.14159m; var y = (dziesiętnie) 3,14159; –

+0

@Marc Gravell: hmm, nie o tym myślę, tylko przeczucie programisty C/C++. Chyba nie biorę tych samych rzeczy za pewnik! Dzięki za wskazówkę. – user7116

Powiązane problemy