Tôi đã tìm kiếm thông số kỹ thuật ngôn ngữ C# và tôi không thể tìm thấy bất kỳ thông tin nào cho biết loại con trỏ (ví dụ: int*
) được khởi tạo với giá trị mặc định. Tôi tạo ra một ứng dụng thử nghiệm đơn giản và nó xuất hiện để khởi tạo chúng bằng không nhưng tôi muốn xác nhận điều này với spec.C# giá trị mặc định của loại con trỏ
tôi bắt đầu tìm kiếm này vì tôi nhận thấy trong phản xạ lớp IntPtr
sử dụng mã này để xác định nó IntPtr.Zero
:
public struct IntPtr : ISerializable
{
private unsafe void* m_value;
public static readonly IntPtr Zero;
.......
public static unsafe bool operator ==(IntPtr value1, IntPtr value2)
{
return (value1.m_value == value2.m_value);
}
........
}
có nghĩa là khi bạn so sánh với IntPtr.Zero
nó thực sự được so sánh với giá trị mặc định được gán cho trường m_value
có loại void*
.
Cảm ơn.
Có một phần của spec, thảo luận con trỏ, thảo luận về cách chúng tương tác với phân tích nhiệm vụ xác định. Cho rằng toàn bộ điểm phân tích nhiệm vụ xác định là để tránh bạn quan sát trạng thái uninitialized của một biến, có lẽ câu trả lời là Mu. Ngoài ra, không phải tất cả mọi thứ bạn nhìn thấy trong việc thực hiện các loại khung là câu chuyện đầy đủ - đôi khi xử lý đặc biệt bởi thời gian chạy tạo ra hành vi thực tế. –
Cũng phát hiện ... có vẻ như họ đã bỏ lỡ nó khi viết spec. Giả sử bạn có thể giả định rằng nó không có (null) :-) – buffjape
Điều khó hiểu là CIL định nghĩa các kiểu con trỏ như là một tập con của các kiểu tham chiếu, nhưng C# định nghĩa các kiểu con trỏ như là một kiểu lớp riêng biệt. Vì vậy, khi CIL xác định rằng các kiểu tham chiếu có giá trị mặc định là 'null', điều đó có nghĩa là nhiều hơn khi C# chỉ định cùng một điều. – hvd