Apa yang default (objek); lakukan di C #?


133

Googling hanya menghasilkan kata kunci, tetapi saya menemukan beberapa kode yang mengatakannya

MyVariable = default(MyObject);

dan saya bertanya-tanya apa artinya.

Jawaban:


189
  • Untuk tipe referensi, ia kembali null
  • Untuk jenis nilai selain Nullable<T>mengembalikan nilai nol yang diinisialisasi
  • Untuk Nullable<T>itu mengembalikan nilai kosong (pseudo-null) (sebenarnya, ini adalah pernyataan ulang dari peluru pertama, tetapi layak untuk membuatnya eksplisit)

Penggunaan terbesar default(T)adalah dalam obat generik, dan hal-hal seperti Try...polanya:

bool TryGetValue(out T value) {
    if(NoDataIsAvailable) {
        value = default(T); // because I have to set it to *something*
        return false;
    }
    value = GetData();
    return true;
}

Seperti yang terjadi, saya juga menggunakannya dalam beberapa pembuatan kode, yang merepotkan untuk menginisialisasi bidang / variabel - tetapi jika Anda tahu jenisnya:

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

1
Jika saya buat class Foodengan properti int n. Dapatkah saya "membebani" defaultuntuk membuatnya diatur nuntuk mengatakan 5bukan 0?
Pratik Deoghare

4
@The Mesin Charmer: No Anda tidak bisa berlebihan default.
Jeff Yates

Bukankah int foo = default(int);itu sama int foo;? Yaitu, jangan menginisialisasi default secara default untuk memiliki nilai yang sama default(int)?
Adam Parkin

1
@AdamParkin itu tergantung pada apakah Anda berbicara tentang bidang vs lokal; ya, bidang diinisialisasi ke ruang nol-d, sama dengan default(...); penduduk setempat tidak memiliki nilai default (walaupun secara teknis, .locals initdalam IL berarti bahwa mereka akan kembali ke nol, tetapi Anda perlu menggunakan mekanisme yang tidak aman untuk mengamatinya)
Marc Gravell

"Ini mengembalikan nilai kosong (psuedo-null) yang ... itu apa? Sepertinya kalimat itu belum selesai.

14

defaultkata kunci akan kembali nulluntuk tipe referensi dan zerountuk tipe nilai numerik.

Untuk structs, ini akan mengembalikan setiap anggota struct yang diinisialisasi ke nol atau nol tergantung pada apakah mereka tipe nilai atau referensi.

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

        }
    }

KELUARAN:

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

3

Nilai default dari MyObject. Lihat Kata Kunci default dalam Kode Generik (Panduan Pemrograman C #) (MSDN):

Di kelas dan metode umum, satu masalah yang muncul adalah bagaimana menetapkan nilai default ke tipe T parameter ketika Anda tidak tahu hal berikut di muka:

  • Apakah T akan menjadi tipe referensi atau tipe nilai.
  • Jika T adalah tipe nilai, apakah itu nilai numerik atau struct.

Dengan variabel t dari tipe T parameter, pernyataan t = null hanya valid jika T adalah tipe referensi dan t = 0 hanya akan berfungsi untuk tipe nilai numerik tetapi tidak untuk struct. Solusinya adalah dengan menggunakan kata kunci default, yang akan mengembalikan nol untuk jenis referensi dan nol untuk jenis nilai numerik. Untuk struct, ini akan mengembalikan setiap anggota struct yang diinisialisasi ke nol atau nol tergantung pada apakah mereka tipe nilai atau referensi. Contoh berikut dari kelas GenericList menunjukkan cara menggunakan kata kunci default. Untuk informasi lebih lanjut, lihat Tinjauan Umum.

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

Menentukan nilai default dari parameter type. Ini akan menjadi nol untuk tipe referensi dan nol untuk tipe nilai.

Lihat default


1

Kata defaultkunci mengembalikan nilai "default" atau "kosong" untuk variabel dari tipe yang diminta.

Untuk semua jenis referensi (didefinisikan dengan class, delegate, dll), ini null. Untuk jenis nilai (didefinisikan dengan struct, enum, dll) itu nilai nol semua (misalnya, int 0, DateTime 0001-01-01 00:00:00, dll).

Itu sebagian besar digunakan dengan kode generik yang dapat diterapkan untuk tipe referensi dan nilai, karena Anda tidak dapat menetapkan nullvariabel tipe nilai.


0

Ini akan mengatur nilai default suatu objek ke variabel: null untuk tipe referensi dan 0 untuk tipe nilai.


0

Mungkin ini dapat membantu Anda:

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

Tidak mungkin untuk menetapkan null untuk tipe generik. Alasannya adalah bahwa tipe generik juga dapat dipakai sebagai tipe nilai, dan null hanya diperbolehkan dengan tipe referensi. Untuk menghindari masalah ini, Anda dapat menggunakan kata kunci default. Dengan kata kunci default, null ditetapkan untuk jenis referensi dan 0 ditugaskan untuk jenis nilai.

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

Kata kunci default memiliki banyak arti tergantung pada konteks di mana kata itu digunakan. Pernyataan switch menggunakan default untuk mendefinisikan case default, dan dengan generics default digunakan untuk menginisialisasi tipe generik menjadi nol atau 0 tergantung pada apakah itu tipe referensi atau nilai.


0

Ketika kendala belum diterapkan untuk membatasi parameter tipe generik menjadi tipe referensi, maka tipe nilai, seperti struct, juga bisa diteruskan. Dalam kasus seperti itu, membandingkan parameter tipe ke nol akan selalu salah , karena struct dapat kosong, tetapi tidak pernah nol

salah kode

public void TestChanges<T>(T inputValue)

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

           }
            catch
            {
                // ignore this.
            }
        }

dikoreksi

public void TestChanges<T>(T inputValue)

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

           }
            catch
            {
                // ignore this.
            }
        }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.