Googling только подходя с ключевым словом, но я наткнулся на некоторый код, который говоритЧто такое default (object); делать в C#?
MyVariable = default(MyObject);
и мне интересно, что это значит ...
Googling только подходя с ключевым словом, но я наткнулся на некоторый код, который говоритЧто такое default (object); делать в C#?
MyVariable = default(MyObject);
и мне интересно, что это значит ...
null
Nullable<T>
он возвращает нулевой инициализировано значениеNullable<T>
она возвращает значение пустого (псевдо-NULL) (на самом деле , это повторное заявление второй пули, но это стоит сделать его явным)Наибольшее применение default(T)
в генериков, и такие вещи, как 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;
}
Как это происходит, я также использовать его в какой-то код поколения, где это боль, чтобы инициализировать поля/переменные - но если вы знаете тип:
bool someField = default(bool);
int someOtherField = default(int)
global::My.Namespace.SomeType another = default(global::My.Namespace.SomeType);
По умолчанию значение MyObject
. См default Keyword in Generic Code (C# Programming Guide) (MSDN):
В общих классах и методах, один вопрос, который возникает, как присвоить значение по умолчанию параметризованного типа T, когда вы не знаете следующими заранее:
- Будет ли T ссылочным типом или типом значения.
- Если T - тип значения, будет ли это числовое значение или структура.
Учитывая переменную т параметризованного типа Т, оператор Т = нуль действует только тогда, когда T является типом ссылки и т = 0 будет работать только для числовых типов значений, но не для структур. Решение заключается в использовании ключевого слова по умолчанию , которое вернет значение null для ссылочных типов и для числовых типов значений. Для structs он возвращает каждому члену структуру, инициализированную нулем или нулем, в зависимости от того, являются ли они значениями или ссылочными типами . В следующем примере из класса GenericList показано, как использовать ключевое слово по умолчанию. Для получения дополнительной информации о см. Общий обзор.
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;
}
}
Задает значение по умолчанию из parameter.This типа будет нулевым для ссылочных типов и ноля для значения типов.
См default
Он установит значение по умолчанию объекта переменный: нуля для ссылочных типов и 0 для типов значений.
default
ключевое слово будет возвращать null
для ссылочных типов и zero
для числовых типов значений.
Для struct
s он возвращает каждый член структуры, инициализированный нулем или нулем, в зависимости от того, являются ли они значениями или ссылочными типами.
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");
}
}
ВЫВОД:
0
f is null
b.FooBar = 0
b.BarFoo is null
Возможно, это может помочь вам:
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; }
}
}
}
Это не представляется возможным назначить нулевой родовым типам. Причина в том, что общий тип также может быть создан как тип значения, а null разрешен только с ссылочными типами. Чтобы обойти эту проблему, вы можете использовать ключевое слово по умолчанию. С ключевым словом по умолчанию null присваивается ссылочным типам, а 0 - типам значений.
public T GetDocument()
{
T doc = default(T);
lock (this)
{
doc = documentQueue.Dequeue();
}
return doc;
}
по умолчанию ключевое слово имеет несколько значений в зависимости от контекста, в котором она используется. Оператор switch использует значение по умолчанию для определения случая по умолчанию, а с помощью дженериков значение по умолчанию используется для инициализации общих типов либо нулями, либо 0 в зависимости от того, является ли это ссылочным или типом значений.
Ключевое слово default
возвращает значение «по умолчанию» или «пустое» для переменной запрашиваемого типа.
Для всех ссылочных типов (определяется class
, delegate
и т. Д.), Это null
. Для типов значений (определенных с помощью struct
, enum
и т. Д.) Это значение с нулевым значением (например, int 0
, DateTime 0001-01-01 00:00:00
и т. Д.).
В основном используется с общим кодом, который может применяться как к ссылочным, так и к типам значений, поскольку вы не можете назначить null
переменной типа значения.
Большое спасибо! – NibblyPig
Если я создаю 'class Foo' с свойством' int n'. Могу ли я «перегрузить» 'default', чтобы он установил' n', чтобы сказать '5' вместо' 0'? –
@ The Charmer: Нет. Вы не можете перегружать 'default'. –