什么是默认(对象); 在C#中做?

谷歌search只是关键字,但我偶然发现了一些代码说

MyVariable = default(MyObject); 

我想知道这是什么意思

  • 对于引用types,它返回null
  • 对于Nullable<T>以外的值types,它将返回一个零初始值
  • 对于Nullable<T>它返回空(伪空)值(实际上,这是第二个项目符号的重新声明,但是值得明确)

default(T)最大的用处是generics,像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; } 

碰巧,我也在一些代码生成中使用它,初始化字段/variables是很痛苦的,但是如果你知道types:

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

对于引用types, default关键字将返回null ,对于数值types,则返回zero

对于struct s,它将返回struct的每个成员初始化为零或null,这取决于它们是值types还是引用types。

从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"); } } 

OUTPUT:

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

指定types参数的默认值。对于引用types,它将为空,对于值types,则为零。

默认

MyObject默认值。 请参阅通用代码(C#编程指南) (MSDN)中的默认关键字

在generics类和方法中,出现的一个问题是如果事先不知道以下内容,如何将缺省值赋给参数化typesT:

  • T是一个引用types还是一个值types。
  • 如果T是一个值types,它将是一个数值还是一个结构体。

给定参数化typesT的variablest,语句t = null仅在T是引用types且t = 0仅适用于数值types但不适用于结构时才有效。 解决方法是使用default关键字,该关键字将为引用types返回null,对于数值types则返回零。 对于结构体,它将返回结构体的每个成员初始化为零或空值,这取决于它们是值types还是引用types。 GenericList类中的以下示例显示了如何使用default关键字。 有关更多信息,请参阅generics概述。

 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关键字返回所请求types的variables的“default”或“empty”值。

对于所有的引用types(用classdelegate等定义),这是null 。 对于值types(用structenum等定义),它是一个全零值(例如, int 0DateTime 0001-01-01 00:00:00等)。

它主要用于可以应用于引用types和值types的generics代码,因为您不能将null赋值给值typesvariables。

它会将对象的默认值设置为一个variables:参考types为null,值types为0。

也许这可能会帮助你:

 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分配给genericstypes。 原因是一个genericstypes也可以实例化为一个值types,而null只允许使用引用types。 为了避免这个问题,你可以使用default关键字。 使用默认关键字,null被分配给引用types,0被分配给值types。

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

默认关键字有多种含义,取决于使用它的上下文。 switch语句使用默认值来定义默认情况,而在generics中,默认值用于初始化genericstypes为null或0,具体取决于引用types还是值types。