2010-03-12 14 views

Trả lời

131
  • Đối với một tài liệu tham khảo-type, nó sẽ trả null
  • Đối với một giá trị kiểu khác hơn Nullable<T> nó trả về một giá trị zero-khởi
  • Đối Nullable<T> nó trả về giá trị rỗng (pseudo-null) (trên thực tế , đây là một tái tuyên bố của viên đạn thứ hai, nhưng nó là giá trị làm cho nó rõ ràng)

việc sử dụng lớn nhất của default(T) là trong Generics, và những thứ như mô hình 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; 
} 

Vì nó xảy ra, tôi cũng sử dụng nó trong một số mã thế hệ mới, mà nó là một nỗi đau để khởi tạo các lĩnh vực/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); 
+0

Cảm ơn rất nhiều! – NibblyPig

+0

Nếu tôi tạo 'class Foo' với thuộc tính' int n'. Tôi có thể "quá tải" 'default' để làm cho nó đặt' n' để nói '5' thay vì' 0'? –

+1

@ Máy Charmer: Không. Bạn không thể quá tải 'mặc định'. –

2

Giá trị mặc định của MyObject. Xem default Keyword in Generic Code (C# Programming Guide) (MSDN):

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

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

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

Xem default

0

Nó sẽ thiết lập giá trị mặc định của một đối tượng cho một biến: null cho các loại tài liệu tham khảo và 0 với nhiều loại giá trị.

9

default từ khóa sẽ trở lại null cho các loại tham chiếu và zero cho các loại giá trị số.

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

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

     } 
    } 

OUTPUT:

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

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 để các kiểu generic. Lý do là một kiểu generic cũng có thể được khởi tạo như một kiểu giá trị, và null chỉ được cho phép với các kiểu tham chiếu. Để giải quyết 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 kiểu tham chiếu và 0 được gán cho các kiểu 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 được sử dụng. Câu lệnh switch sử dụng một mặc định để xác định trường hợp mặc định, và với Generics mặc định được sử dụng để khởi tạo các kiểu generic hoặc là null hoặc 0 tùy thuộc vào nếu nó là một kiểu tham chiếu hoặc giá trị.

1

Từ khóa default trả về giá trị "mặc định" hoặc "trống" cho một biến loại được yêu cầu.

Đối với tất cả các loại tham chiếu (được xác định với class, delegate, v.v.), đây là null. Đối với các loại giá trị (được xác định bằng struct, enum, v.v ...) là giá trị tất cả 0 (ví dụ: int 0, DateTime 0001-01-01 00:00:00, v.v ...).

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

Các vấn đề liên quan