default(object)とは C#で行う?


133

グーグルはキーワードを考え出すだけですが、私は言ういくつかのコードに偶然出会いました

MyVariable = default(MyObject);

それが何を意味するのか疑問に思っています。

回答:


189
  • 参照型の場合は、次を返します 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
class Fooプロパティで作成した場合int n。「オーバーロード」defaultして代わりnに言うように設定できますか?50
Pratik Deoghare

4
@The Machine Charmer:いいえdefault。オーバーロードすることはできません。
ジェフイェイツ

ありませんint foo = default(int);同じでしたかint foo;?つまり、初期化されていないintは、デフォルトで同じ値になりdefault(int)ませんか?
Adam Parkin

1
@AdamParkinは、フィールドとローカルのどちらについて話しているかによって異なります。はい、フィールドはゼロと同じスペースで初期化されdefault(...)ます。ローカルにデフォルト値がありません(技術的には.locals init、IL では再びデフォルトがゼロになることを意味しますが、安全でないメカニズムを使用して監視する必要があります)
Marc Gravell

?「それはどのような文のように見えるが終了していなかったことをことを...空(擬似ヌル)の値を返します。

14

defaultキーワードはnull、参照タイプおよびzero数値タイプに対して返されます。

以下のためstructの、それが値または参照タイプであるかどうかに応じて、ゼロまたはヌルに初期化構造体の各メンバーを返します。

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

3

のデフォルト値MyObjectジェネリックコードの既定のキーワード(C#プログラミングガイド)(MSDN)を参照してください。

ジェネリッククラスとジェネリックメソッドで発生する問題の1つは、事前に次のことを知らない場合に、パラメーター化された型Tにデフォルト値を割り当てる方法です。

  • Tが参照型または値型になるかどうか。
  • Tが値の型の場合、数値または構造体のどちらになるか。

パラメーター化された型Tの変数tが与えられた場合、ステートメントt = nullは、Tが参照型であり、t = 0が数値型に対してのみ機能し、構造体に対しては機能しない場合にのみ有効です。解決策は、デフォルトのキーワードを使用することです。これは、参照タイプの場合はnullを返し、数値タイプの場合はゼロを返します。構造体の場合、それが値型か参照型かに応じて、ゼロまたは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;
    }
}

2

タイプパラメータのデフォルト値を指定します。これは、参照タイプの場合はnull、値タイプの場合はゼロになります。

デフォルトを見る


1

defaultキーワードを返す要求された型の変数のための「デフォルト」または「空」の値。

(で定義されたすべての参照型のためclassdelegateなど)、これがありますnull。(で定義された値型のためstructenumなど)には、(例えば、すべてゼロの値だint 0DateTime 0001-01-01 00:00:00など)。

null値型の変数に割り当てることができないため、主に参照型と値型の両方に適用できる汎用コードで使用されます。


0

オブジェクトのデフォルト値を変数に設定します。参照タイプの場合はnull、値タイプの場合は0です。


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を割り当てることはできません。その理由は、ジェネリック型も値型としてインスタンス化でき、nullは参照型でのみ許可されているためです。この問題を回避するには、デフォルトのキーワードを使用できます。デフォルトのキーワードでは、nullが参照型に割り当てられ、0が値型に割り当てられます。

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

デフォルトのキーワードは、それが使用されるコンテキストに応じて複数の意味を持ちます。switchステートメントは、デフォルトのケースを定義するためにデフォルトを使用します。ジェネリックでは、デフォルトを使用して、ジェネリックタイプを参照タイプと値タイプのどちらであるかに応じて、nullまたは0に初期化します。


0

ジェネリック型パラメーターを参照型に制限する制約が適用されていない場合、構造体などの値型も渡すことができます。このような場合、構造体を空にすることはできますがnullにすることはできないため、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.
            }
        }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.