Câu trả lời:
null
Nullable<T>
giá trị khởi tạo bằng 0Nullable<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);
default
.
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)
?
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 init
trong 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ó)
default
từ khóa sẽ trả về 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 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.
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
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;
}
}
Các default
lợ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 null
cho biến loại giá trị.
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ị.
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.
}
}
class Foo
với tài sảnint n
. Tôi có thể "quá tải"default
để đặt nó thành thay vìn
nói không?5
0