visual tutorial studio sharp programacion lenguaje ejemplos curso codigo caracteristicas c#

tutorial - Qué hace por defecto(objeto); hacer en C#?



visual c# (7)

La búsqueda de palabras clave en Google solo viene con la palabra clave, pero me encontré con un código que dice

MyVariable = default(MyObject);

y me pregunto qué significa ...


Especifica el valor predeterminado del parámetro de tipo. Esto será nulo para los tipos de referencia y cero para los tipos de valores.

Ver por default


Establecerá el valor predeterminado de un objeto en una variable: nulo para los tipos de referencia y 0 para los tipos de valores.


La palabra clave default devuelve el valor "predeterminado" o "vacío" para una variable del tipo solicitado.

Para todos los tipos de referencia (definidos con class , delegate , etc.), esto es null . Para los tipos de valor (definidos con struct , enum , etc.) es un valor de ceros (por ejemplo, int 0 , DateTime 0001-01-01 00:00:00 , etc.).

Se usa principalmente con código genérico que se puede aplicar tanto a los tipos de referencia como a los de valor porque no se puede asignar null a una variable de tipo de valor.


Tal vez esto pueda ayudarte:

using System; using System.Collections.Generic; namespace Wrox.ProCSharp.Generics { public class DocumentManager < T > { private readonly Queue < T > documentQueue = new Queue < T > (); public void AddDocument(T doc) { lock (this) { documentQueue.Enqueue(doc); } } public bool IsDocumentAvailable { get { return documentQueue.Count > 0; } } } }

No es posible asignar null a tipos genéricos. La razón es que un tipo genérico también se puede instanciar como un tipo de valor, y null solo se permite con tipos de referencia. Para evitar este problema, puede usar la palabra clave predeterminada. Con la palabra clave predeterminada, null se asigna a los tipos de referencia y 0 se asigna a los tipos de valores.

public T GetDocument() { T doc = default(T); lock (this) { doc = documentQueue.Dequeue(); } return doc; }

La palabra clave predeterminada tiene múltiples significados según el contexto donde se usa. La instrucción switch usa un valor predeterminado para definir el caso predeterminado, y con los genéricos, el valor predeterminado se usa para inicializar los tipos genéricos en nulo o en 0, dependiendo de si es un tipo de referencia o de valor.


Valor predeterminado de MyObject . Consulte la Palabra clave predeterminada en Código genérico (Guía de programación C #) (MSDN):

En clases y métodos genéricos, una cuestión que surge es cómo asignar un valor predeterminado a un tipo parametrizado T cuando no se conoce lo siguiente por adelantado:

  • Si T será un tipo de referencia o un tipo de valor.
  • Si T es un tipo de valor, ya sea un valor numérico o una estructura.

Dada una variable t de un tipo parametrizado T, la instrucción t = null solo es válida si T es un tipo de referencia yt = 0 solo funcionará para los tipos de valores numéricos pero no para las estructuras. La solución es usar la palabra clave predeterminada, que devolverá nulo para los tipos de referencia y cero para los tipos de valores numéricos. Para las estructuras, devolverá a cada miembro de la estructura inicializada a cero o nulo dependiendo de si son valores o tipos de referencia. El siguiente ejemplo de la clase GenericList muestra cómo usar la palabra clave predeterminada. Para obtener más información, consulte Información general sobre genéricos.

public class GenericList<T> { private class Node { //... public Node Next; public T Data; } private Node head; //... public T GetNext() { T temp = default(T); Node current = head; if (current != null) { temp = current.Data; current = current.Next; } return temp; } }


default palabra clave default devolverá null para los tipos de referencia y zero para los tipos de valores numéricos.

Para struct s, devolverá cada miembro de la estructura inicializada a cero o nulo dependiendo de si son valores o tipos de referencia.

de MSDN

Simple Sample code :<br> class Foo { public string Bar { get; set; } } struct Bar { public int FooBar { get; set; } public Foo BarFoo { get; set; } } public class AddPrinterConnection { public static void Main() { int n = default(int); Foo f = default(Foo); Bar b = default(Bar); Console.WriteLine(n); if (f == null) Console.WriteLine("f is null"); Console.WriteLine("b.FooBar = {0}",b.FooBar); if (b.BarFoo == null) Console.WriteLine("b.BarFoo is null"); } }

SALIDA:

0 f is null b.FooBar = 0 b.BarFoo is null


  • Para un tipo de referencia, devuelve null
  • Para un tipo de valor que no sea Nullable<T> , devuelve un valor cero inicializado
  • Para Nullable<T> devuelve el valor vacío (pseudo-nulo) (en realidad, esta es una nueva declaración del segundo punto, pero vale la pena hacerlo explícito)

El mayor uso del default(T) es en genéricos, y cosas como el patrón Try...

bool TryGetValue(out T value) { if(NoDataIsAvailable) { value = default(T); // because I have to set it to *something* return false; } value = GetData(); return true; }

Da la casualidad, también lo uso en algunos generación de código, donde es difícil inicializar campos / variables, pero si conoces el tipo:

bool someField = default(bool); int someOtherField = default(int) global::My.Namespace.SomeType another = default(global::My.Namespace.SomeType);