2010-03-12 2 views

ответ

131
  • Для получения эталонного типа, он возвращает 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); 
+0

Большое спасибо! – NibblyPig

+0

Если я создаю 'class Foo' с свойством' int n'. Могу ли я «перегрузить» 'default', чтобы он установил' n', чтобы сказать '5' вместо' 0'? –

+1

@ The Charmer: Нет. Вы не можете перегружать 'default'. –

2

По умолчанию значение 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; 
    } 
} 
2

Задает значение по умолчанию из parameter.This типа будет нулевым для ссылочных типов и ноля для значения типов.

См default

0

Он установит значение по умолчанию объекта переменный: нуля для ссылочных типов и 0 для типов значений.

9

default ключевое слово будет возвращать null для ссылочных типов и zero для числовых типов значений.

Для struct s он возвращает каждый член структуры, инициализированный нулем или нулем, в зависимости от того, являются ли они значениями или ссылочными типами.

from 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"); 

     } 
    } 

ВЫВОД:

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

Возможно, это может помочь вам:

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 в зависимости от того, является ли это ссылочным или типом значений.

1

Ключевое слово default возвращает значение «по умолчанию» или «пустое» для переменной запрашиваемого типа.

Для всех ссылочных типов (определяется class, delegate и т. Д.), Это null. Для типов значений (определенных с помощью struct, enum и т. Д.) Это значение с нулевым значением (например, int 0, DateTime 0001-01-01 00:00:00 и т. Д.).

В основном используется с общим кодом, который может применяться как к ссылочным, так и к типам значений, поскольку вы не можете назначить null переменной типа значения.

Смежные вопросы