Không mặc định (đối tượng); làm gì trong C #?


133

Googling chỉ đến với từ khóa, nhưng tôi tình cờ thấy một số mã nói

MyVariable = default(MyObject);

và tôi đang tự hỏi nó có nghĩa là gì.

Câu trả lời:


189
  • Đối với kiểu tham chiếu, nó trả về null
  • Đối với loại giá trị khác với Nullable<T>giá trị khởi tạo bằng 0
  • Đối với Nullable<T>nó trả về giá trị trống (pseudo-null) (thực ra, đây là một tuyên bố lại của viên đạn đầu tiên, nhưng nó đáng để làm cho nó rõ ràng)

Việc sử dụng lớn nhất default(T)là trong thuốc generic và những thứ như Try...mẫu:

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

Khi điều đó xảy ra, tôi cũng sử dụng nó trong một số thế hệ mã, trong đó thật khó để khởi tạo các trường / biến - nhưng nếu bạn biết loại:

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

1
Nếu tôi tạo ra class Foovới tài sản int n. Tôi có thể "quá tải" defaultđể đặt nó thành thay vì nnói không? 50
Pratik Deoghare

4
@ The Machine Charmer: Không. Bạn không thể quá tải default.
Jeff Yates

Không int foo = default(int);giống nhau int foo;sao? Tức là không mặc định ints mặc định có cùng giá trị như default(int)?
Adam Parkin

1
@AdamParkin phụ thuộc vào việc bạn đang nói về các lĩnh vực so với người dân địa phương; có, các trường khởi tạo thành một không gian zero-d, giống như default(...); người dân địa phương không có giá trị mặc định (mặc dù về mặt kỹ thuật, .locals inittrong IL có nghĩa là họ sẽ lại mặc định về 0, nhưng bạn cần sử dụng các cơ chế không an toàn để quan sát nó)
Marc Gravell

"Nó trả về giá trị trống (psuedo-null) mà ... đó là gì? Có vẻ như câu chưa kết thúc.

14

defaulttừ khóa sẽ trả về nullcho các loại tham chiếu và zerocho các loại giá trị số.

Đối với structs, nó sẽ trả về mỗi thành viên của cấu trúc được khởi tạo về 0 hoặc null tùy thuộc vào việc chúng là các loại giá trị hoặc tham chiếu.

từ 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");

        }
    }

ĐẦU RA:

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

3

Giá trị mặc định của MyObject. Xem từ khóa mặc định trong Mã chung (Hướng dẫn lập trình C #) (MSDN):

Trong các lớp và phương thức chung, một vấn đề phát sinh là làm thế nào để gán giá trị mặc định cho loại T được tham số hóa khi bạn không biết trước những điều sau:

  • Cho dù T sẽ là một loại tham chiếu hoặc một loại giá trị.
  • Nếu T là loại giá trị, cho dù đó sẽ là giá trị số hay cấu trúc.

Cho một biến t của loại T được tham số hóa, câu lệnh t = null chỉ hợp lệ nếu T là loại tham chiếu và t = 0 sẽ chỉ hoạt động cho các loại giá trị số chứ không phải cho các cấu trúc. Giải pháp là sử dụng từ khóa mặc định, sẽ trả về null cho các loại tham chiếu và 0 cho các loại giá trị số. Đối với các cấu trúc, nó sẽ trả về mỗi thành viên của cấu trúc được khởi tạo về 0 hoặc null tùy thuộc vào việc chúng là các loại giá trị hoặc tham chiếu. Ví dụ sau từ lớp GenericList cho thấy cách sử dụng từ khóa mặc định. Để biết thêm thông tin, xem Tổng quan về 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;
    }
}

2

Chỉ định giá trị mặc định của tham số loại. Điều này sẽ là null cho các loại tham chiếu và 0 cho các loại giá trị.

Xem mặc định


1

Các defaultlợi nhuận từ khóa là "mặc định" hay giá trị "trống rỗng" cho một biến của các loại yêu cầu.

Đối với tất cả các loại tài liệu tham khảo (được định nghĩa với class, delegate, vv), đây là null. Đối với các loại giá trị (được định nghĩa với struct, enum, vv) nó là một giá trị hoàn toàn zero (ví dụ int 0, DateTime 0001-01-01 00:00:00, vv).

Nó chủ yếu được sử dụng với mã chung có thể được áp dụng cho cả loại tham chiếu và loại giá trị, vì bạn không thể gán nullcho biến loại giá trị.


0

Nó sẽ đặt giá trị mặc định của một đối tượng thành một biến: null cho các loại tham chiếu và 0 cho các loại giá trị.


0

Có lẽ điều này có thể giúp bạn:

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

Không thể gán null cho các loại chung chung. Lý do là một loại chung cũng có thể được khởi tạo như một loại giá trị và null chỉ được phép với các loại tham chiếu. Để khắc phục vấn đề này, bạn có thể sử dụng từ khóa mặc định. Với từ khóa mặc định, null được gán cho các loại tham chiếu và 0 được gán cho các loại giá trị.

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

Từ khóa mặc định có nhiều nghĩa tùy thuộc vào ngữ cảnh nơi nó được sử dụng. Câu lệnh chuyển đổi sử dụng mặc định để xác định trường hợp mặc định và với tổng quát, mặc định được sử dụng để khởi tạo các loại chung thành null hoặc 0 tùy thuộc vào loại tham chiếu hoặc loại giá trị.


0

Khi các ràng buộc chưa được áp dụng để hạn chế tham số loại chung là loại tham chiếu, thì loại giá trị, chẳng hạn như cấu trúc, cũng có thể được thông qua. Trong các trường hợp như vậy, việc so sánh tham số loại với null sẽ luôn là sai , bởi vì một cấu trúc có thể trống, nhưng không bao giờ null

sai mã

public void TestChanges<T>(T inputValue)

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

           }
            catch
            {
                // ignore this.
            }
        }

sửa chữa

public void TestChanges<T>(T inputValue)

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

           }
            catch
            {
                // ignore this.
            }
        }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.