2010-01-28 24 views
12

Me gustaría tener una variable entera que se pueda establecer como nula y no quiera tener que usar la sintaxis int? myVariable. Intenté usar int y Int16 en vano. ¿Debo usar int? myVariable?¿Cuál es el tipo de referencia entero en C#?

Mencioné esto porque en Java hay tanto un tipo 'int' (una primitiva) como 'Entero' (un tipo de referencia). Quería asegurarme de que no haya un tipo de referencia entero integrado que pueda estar usando. Voy a usar 'int' por lo que estoy haciendo

+5

... ¿Por qué no quieres usar esa sintaxis? – womp

+3

@Jon, es como ... Quiero que el compilador lo sepa sin que yo lo diga. – Dykam

Respuesta

26

Para obtener información, int?/Nullable<T> es no a reference-type; es simplemente un "tipo anulable", que significa: una estructura (esencialmente y int y una bandera bool) con reglas de compilación especiales (re null checks, operadores, etc.) y reglas CLI (para boxeo/unboxing). No es no "número entero de referencia del tipo" en .NET, a menos que cuentes el boxeo:

int i = 123; 
object o = i; // box 

pero esto crea un objeto innecesario y tiene un montón de otros problemas asociados.

Para lo que quieras, int? debería ser ideal. Usted podría usar la sintaxis larga (Nullable<int>) pero IMO esto es innecesariamente detallado, y lo he visto confundir a las personas.

+4

IMHO _? _ La confusión depende del fondo - confunde a la gente de ruby. Estamos usando Nullable googleable y msdnable :) para los recién llegados –

+0

¿Cómo lidiaría con el escenario donde tiene un IDictionary que digamos que usa como un conteo para varios objetos. El código "theDictionary [someObject] = newValue" no funcionaría ya que el valor devuelto de la llamada del indizador ("[..]") no es una referencia de objeto al mismo valor almacenado en la instancia KeyValuePair del diccionario. Para incrementar el contador, ¿tendría que quitar el KVP y volver a agregarlo para escribir nuevos valores en el KVP? ¿O hay alguna otra manera? – Marchy

+1

@Marchy 'theDictionary [someObject] = newValue' funcionará bien; eso es asignación a un indexador, que está bien definido y totalmente respaldado –

2

Sí, es la única manera, ya que Int32/Int16/int es un tipo primitivo (sin importar el boxeo/unboxing de estos).

8

Si usted debe utilizar tipos anulables

Ver Nullable

Nullable<int> Nullable<float> 

o simplemente

int? float? 

PS:

Si no desea utilizar ? notación o Nullable en absoluto, simplemente use estructuras especiales para tal cosa. Por ejemplo DataTable:

var table = new DataTable(); 
table.Columns.Add('intCol',typeof(int)); 
var row = table.NewRow(); 
row['intCol'] = null; // 
+0

Tenga en cuenta que esto no es un tipo de referencia, según su enlace ("Representa un tipo de valor que puede asignarse nulo"). Pero responde el problema subyacente de OP, si no la pregunta en el título. – Kat

0

La sintaxis <var>? hace que sea anulable. Si profundizas un poco más, verás que es solo un objeto genérico que se usa.

Si quieres hacerlo como C++ debes utilizar operaciones inseguras. Entonces, los punteros como en C están disponibles, pero su código no se ajusta a CLR ...

Para usar .NET puro sin punteros, el ? es el camino a seguir.

+5

No es un objeto, Nullable es una estructura. –

0

Sí. Es por eso que Microsoft agregó eso. La gente estaba creando su propia clase Nullable, por lo que incluyeron este patrón en .NET.

0

Usted tendrá que utilizar un tipo anulable, es decir:

Nullable<int> or int? 

El propósito del tipo anulable es decir, para que pueda para asignar null a un tipo de valor.

De MSDN:

tipos anulables abordar el escenario en el que desea ser capaz de tener un tipo primitivo con un nulo (o desconocido) valor. Esto es común en escenarios de bases de datos, pero también es útil en otras situaciones.

En el pasado, había varias maneras de hacer esto:

  1. un tipo de valor en caja. Esto no está fuertemente tipado en tiempo de compilación, e implica hacer una asignación de montón para cada tipo.
  2. Un contenedor de clase para el tipo de valor. Esto está fuertemente tipado, pero aún implica una asignación de montón, y usted tiene que escribir el contenedor.
  3. Un contenedor de estructuras que admite el concepto de nulability. Esta es una buena solución, pero debes escribirla tú mismo.
Cuestiones relacionadas