2010-04-13 30 views
30

He estado en varias ocasiones pidió a las siguientes preguntas en muchas entrevistas .... Pero todavía no puedo explicar con un ejemplo sencillo ...¿Cuándo se deben usar tipos anulables en C#?

  1. ¿Cuáles son los tipos anulables en C#?
  2. ¿Cuándo se deben usar tipos anulables en C#?
  3. ¿Puedes dar un ejemplo simple?

¿Alguna sugerencia?

+1

posible duplicado de http://stackoverflow.com/questions/1550909/coding-practices-for-c-nullable-type – Ether

Respuesta

30

De Using Nullable Types (C# Programming Guide)

Para un ejemplo de cuándo se puede utilizar un tipo anulable , considere cómo una variable booleana ordinaria puede tener dos valores: verdaderos y falsos. No hay ningún valor que signifique "indefinido". En muchas aplicaciones de programación, la mayoría de las , en particular las interacciones de bases de datos, variables pueden existir en un estado indeterminado . Por ejemplo, un campo en una base de datos puede contener los valores true o falso, pero también puede contener ningún valor . De forma similar, los tipos de referencia pueden establecerse en nulo para indicar que no se han inicializado.

+0

pero cualquier referencia (objeto por ejemplo) puede ser nula. así que, en lugar de boxear un 'bool' en' Nullable', ¿por qué no ponerlo en 'Boolean' todavía me pregunto por qué ... –

17

Nulo significa "sin valor" o "sin datos". Usas tipos que aceptan valores null cuando "sin valor" es un valor válido en el contexto del sistema que estés usando/desatinando.

int? weightOfCargo = TryGetTruckCargoWeight() 

En este caso, el tipo anulable indica que TryGetTruckCargoWeight() puede devolver nulo. El significado de esto sería genreally que los datos no están disponibles (tal vez no hay camiones, tal vez no ha sido pesado, etc.).

9

Considere siguiente ejemplo:

Una herramienta tiene la configuración especificada a través de la interfaz de usuario. Sin embargo, la herramienta también se puede ejecutar desde la línea de comandos y la configuración especificada en la interfaz de usuario se puede anular a través de la línea de comandos. Por lo que el código es el siguiente:

bool? setting1; 

... línea de comandos de proceso, si el ajuste especificado hacer:

setting1.Value = setting; 

... más tarde

if(setting1.HasValue) 
    ui.setting1 = setting1.Value 
4

Siempre que estés utilizando valores designados para representar un valor nulo:
* Un valor mínimo DateTime para representar un valor de nada
* -1 para representar un valor no establecido para r un número entero
y luego un tipo anulable sería una mejor opción.

1
// to replace 
// if(foo.Id > 0) 
if(foo.Id.HasValue) 
{ 
    Update(foo); 
} 
else 
{ 
    Insert(foo); 
} 
4

Como todos sabemos, hay dos tipos diferentes de C#

• Tipo Refrence
• Tipo de valor
tipo referencia se puede representar como el valor existente no (NULO) pero el tipo Vaue, sin embargo, no puede representa el valor NULL
Por ejemplo

Desde cadena es del tipo de referencia se puede declarar como nulo

String s=null; //ok

Pero si intenta declarar tipo de valor tales como Int32 en nulo que produceses error del compilador

Int32 i=null; // compiler error

Para representar nulo en un tipo de valor, debe usar una construcción especial llamada tipo anulable. ¿Está representado usando? símbolo.

Int32? I=null; //now its ok

Ahora escenario cuando commanly utilizan tipos anulables es en la programación de base de datos donde calss es el mapa de la tabla con columnas anulables.
• Si las columnas son del tipo de referencia String como (dirección de correo electrónico y dirección del cliente), no hay problema ya que puede definirlo como nulo en C#
• Pero si las columnas son de tipo de valor doble como (saldo de la cuenta del cliente), no puede asignarlo a C# sin usar tipos que aceptan nulos.
Para por ejemplo
// maps a una mesa de atención al cliente en una base de datos


public class Customer 
{ 
    ... 
    public decimal? AccountBalance; 
} 
+9

@Vijay: string es un tipo de referencia. No es un tipo de valor – Jehof

+0

Corrección pequeña: en realidad hay tres tipos diferentes. ¿Qué pasa con los tipos de punteros? :) http://msdn.microsoft.com/en-us/library/y31yhkeb.aspx –

+0

@Jehof: gracias por señalar errores evidentes –

2

C# tiene dos tipos de tipos de datos. Tipo de valor y tipos de referencia. String es tipo de referencia e int es tipo de valor. Se puede asignar un tipo de referencia con un valor nulo como string s = null;. Pero no puede asignar un valor nulo directamente a un entero. Como int a = null // Entonces, para hacer que el tipo de valor acepte un valor nulo, se usan tipos anulables. Para que sea anulable, se añade un ? en

? a = null;//ok. 
1

Creo que si hablamos de escenario del mundo real cuando su tabla de base de datos contiene columnas con valores nulos en ella y que necesita para crear DTO (transferencia de datos Objects) como Db entidad Mapeo . En tales escenarios, necesitas obtener la misma asignación de tipo de datos en tus clases de Entidad. Para lograr tal requisito, los tipos nulables son realmente muy útiles para crear exactamente la misma asignación y permitir al usuario trabajar fácilmente en este senario.

Atentamente.

3

Un ejemplo más:

imaginar, es necesario crear un método GetArticles en su BLL. Este método debe tomar argumentos como el período de fecha (argumentos from y to), cadena de búsqueda (argumento search) y categoría del documento (argumento categoryId). Todos estos argumentos son opcionales. Por lo tanto, en un caso, solo debe definir el argumento from y search, en el otro argumento solo categoryId.

Para hacer esto, puede crear muchas sobrecargas para el método GetArticles con la combinación de argumentos necesaria.La otra forma es definir el único método GetArticles(DateTime? from, DateTime? to, string search, int? categoryId) para esto. En este caso, si el argumento es null, se omitirá.

De la causa que sé sobre una nueva característica en .NET 4.0 llamó optional parameters and named arguments pero antes de esto, fue una buena solución para mí.