什么是默认(对象); 在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(用class
, delegate
等定义),这是null
。 对于值types(用struct
, enum
等定义),它是一个全零值(例如, int 0
, DateTime 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。