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

时间:2010-03-12 13:14:28

标签: c#

谷歌搜索只提供关键字,但我偶然发现了一些代码

MyVariable = default(MyObject);

我想知道这是什么意思......

9 个答案:

答案 0 :(得分:166)

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

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

答案 1 :(得分:13)

对于引用类型,

default关键字将返回null,对于数值类型,将返回zero

对于struct,它将返回初始化为struct或null的结构的每个成员,具体取决于它们是值还是引用类型。

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

答案 2 :(得分:3)

MyObject的默认值。请参阅 default Keyword in Generic Code (C# Programming Guide) (MSDN):

  

在通用类和方法中,出现的一个问题是如何分配   当你不知道时,参数化类型T的默认值   提前关注:

     
      
  • T是引用类型还是值类型。
  •   
  • 如果T是值类型,则它是数值还是结构。
  •   
     

给定参数化类型T的变量t,语句t = null   仅当T是引用类型且t = 0才有效时才有效   数值类型,但不适用于结构。解决方案是使用   default关键字,它将为引用类型返回null并为零   对于数值类型。对于结构,它将返回每个成员   struct初始化为零或null,具体取决于它们是否为   价值或参考类型。以下示例来自   GenericList类显示如何使用default关键字。更多   信息,请参阅泛型概述。

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;
    }
}

答案 3 :(得分:2)

  

指定的默认值   type参数。这将为null   引用类型和值为零   类型。

参见 default

答案 4 :(得分:1)

default关键字返回所请求类型变量的“默认”或“空”值。

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

它主要用于可以应用于引用和值类型的通用代码,因为您无法将null分配给值类型变量。

答案 5 :(得分:0)

它会将对象的默认值设置为变量: 引用类型为null,值类型为0。

答案 6 :(得分:0)

如果未应用约束将通用类型参数限制为引用类型,则也可以传递值类型(例如struct)。在这种情况下,将type参数比较为null总是为false 因为结构可以为空,但不能为空

错误的代码

public void TestChanges<T>(T inputValue)

            try
            {
                if (inputValue==null)
                    return;
                //operation on inputValue

           }
            catch
            {
                // ignore this.
            }
        }

已更正

public void TestChanges<T>(T inputValue)

            try
            {
                if (object.Equals(inputValue, default(T)) )
                    return;
                //operation on inputValue

           }
            catch
            {
                // ignore this.
            }
        }

答案 7 :(得分:0)

default(T)的另一个很好的用途是当编译器无法确定返回类型时(如此处)

class X
{
    public int? P {get; set;}
}

// assigning in code

var x = new X();

// consider coll["key"] returns object boxed value
// data readers is one such case
x.P = myReader["someColumn"] == DbNull.Value ? default(int?) : (int)myReader["someColumn"];


答案 8 :(得分:-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。要避免此问题,可以使用default关键字。使用default关键字时,null将分配给引用类型,0将分配给值类型。

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

默认关键字具有多种含义,具体取决于使用它的上下文。开关 语句使用默认值来定义默认大小写,并且使用泛型默认用于将泛型类型初始化为null或0,具体取决于它是引用还是值类型。