googlear solamente es dar con la palabra clave, pero se topó con un código que dice¿Qué significa el valor predeterminado (objeto)? hacer en C#?
MyVariable = default(MyObject);
y me pregunto lo que significa ...
googlear solamente es dar con la palabra clave, pero se topó con un código que dice¿Qué significa el valor predeterminado (objeto)? hacer en C#?
MyVariable = default(MyObject);
y me pregunto lo que significa ...
null
Nullable<T>
devuelve un valor-inicializado ceroNullable<T>
devuelve el valor vacío (pseudo-null) (en realidad , esta es una reexpresión de la segunda bala, pero vale la pena hacerlo explícito)el mayor uso de default(T)
está en los 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 de que también lo utilizan de alguna de generación de código, donde es un dolor para inicializar campos/variables - pero si usted sabe el tipo:
bool someField = default(bool);
int someOtherField = default(int)
global::My.Namespace.SomeType another = default(global::My.Namespace.SomeType);
valor predeterminado de MyObject
. Ver default Keyword in Generic Code (C# Programming Guide) (MSDN):
En las clases y métodos genéricos, una cuestión que se plantea es cómo asignar un valor predeterminado a un tipo T parametrizado cuando no se conoce el siguiente antelación:
- 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.
dado un t variable de un tipo parametrizado T, la declaración t = null sólo es válida si T es un tipo de referencia y t = 0 sólo funcionará para tipos de valores numéricos, pero no para 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 structs, devolverá cada miembro de la estructura inicializada a cero o nulo según si son valor 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 sobre , 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;
}
}
Especifica el valor por defecto de los parameter.This tipo será nulo para tipos de referencia y cero para el valor tipos.
Ver default
Se establecerá el valor predeterminado de un objeto a una variable: nulo para los tipos de referencia y 0 para los tipos de valor.
default
palabra clave volverá null
para tipos de referencia y zero
para 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.
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
Tal vez esto le puede ayudar:
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 nula a los 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 por defecto tiene múltiples significados dependiendo del contexto en el que se utiliza. La instrucción switch utiliza un valor predeterminado para definir el caso predeterminado, y con los genéricos, el valor predeterminado se utiliza para inicializar los tipos genéricos en nulo o 0, dependiendo de si es un tipo de referencia o de valor.
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 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 a los tipos de referencia y de valor, porque no puede asignar null
a una variable de tipo de valor.
¡Muchas gracias! – NibblyPig
Si creo 'clase Foo' con la propiedad' int n'. ¿Puedo "sobrecargar" 'default' para que se configure' n' para decir '5' en lugar de' 0'? –
@The Machine Charmer: No. No puede sobrecargar 'default'. –