2008-10-03 9 views
30

¿Alguien sabe la lista completa de modificadores de número de compilador literal de C#?C# literales de número de compilador

Por defecto, declarar '0' lo convierte en Int32 y '0.0' lo convierte en 'Doble'. Puedo usar el modificador literal 'f' al final para asegurar que algo sea tratado como 'Single' en su lugar. Por ejemplo, como este ...

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

¿Cuáles son los otros modificadores que puedo usar? ¿Hay uno para forzar a Double, Decimal, UInt32? Intenté buscar en Google esto, pero no pude encontrar nada. Tal vez mi terminología es incorrecta y eso explica por qué estoy en blanco. Cualquier ayuda muy apreciada.

Respuesta

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) 

De los C# specification 2.4.4.2 y 2.4.4.3 literales enteros literales reales. Tenga en cuenta que L y UL son preferibles en lugar de sus variantes en minúsculas para mayor claridad, como se recomienda en Jon Skeet.

+14

Mientras que ciertamente es válido para largos, recomiendo usar L en su lugar, es igual de válido , y no se ve como un "1" –

+2

@Jon Skeet: el mal hábito de un programador C, agregó su consejo. – user7116

5

Es posible que desee comenzar por looking at the C# language spec. La mayoría de los tipos se enumeran en ese país, y tienen un sufijo:

  • L = largo
  • F = flotar
  • T = uint
  • de ULONG son un little different
  • m = decimal (dinero)
  • D = doble

Por supuesto, si deja de usar var entonces a moverse por todo el problema, y ​​su código se vuelve más legible (bueno, eso es subjetivo, pero para algo como esto, es más fácil de leer por otras personas:

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

@Nic Wise: +1 dejar de usar var; D Aunque simplifica mostrar qué sufijo va con qué tipo. – user7116

+0

sí, muy buen punto :) Me gusta var en general, especialmente en las declaraciones de foreach (foreach (var a en mi lista)) pero aparte de eso, no soy un gran fan. –

11

Si no quieren tener que recordarlos, luego el compilador también acepta un elenco para el mismo propósito (puede verificar que el IL es el mismo efecto, es decir, el compilador, no el tiempo de ejecución, lo hace). Para tomar prestado el ejemplo anterior:

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 

Y para el registro, acepto que "var" es una mala elección aquí; Usaré felizmente var para SortedDictionary < SomeLongType, SomeOtherLongType >, pero para "int" es simplemente vago ...

+0

@Marc Gravell: +1 buenos consejos usando el reparto, pero a veces necesitas usar el sufijo (por ejemplo, mal ejemplo, 3.14159m). Yo personalmente uso el elenco cuando estoy buscando ser explícito. – user7116

+0

El compilador trata lo siguiente de forma idéntica; ¿Tienes un ejemplo donde hace la diferencia? var x = 3.14159m; var y = (decimal) 3.14159; –

+0

@Marc Gravell: hmm, no es lo único que se me ocurre, solo el presentimiento de un programador C/C++. ¡Supongo que no doy por hecho las mismas cosas! Gracias por el consejo. – user7116

Cuestiones relacionadas