2015-02-06 19 views
13

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.

+1

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ế. –

+0

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

+0

Đ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

Trả lời

-1

Sử dụng trình gỡ lỗi Visual Studio, bạn có thể nhận giá trị mặc định được gán cho con trỏ int. Trong kiến ​​trúc 32 bit, nó là 0x00000000 (32 0 bit).

class Program 
{ 
    private static unsafe int* m_value; 
    static void Main(string[] args) 
    { 
    } // <<== Break point here 
} 

Watch Window 
_____________________________________________ 
Name Value  Type 
======= ========== ======== 
m_value 0x00000000 int* 
+2

Có như tôi đã nói tôi đã viết một ứng dụng thử nghiệm mà đã làm điều này nhưng điều này không nhất thiết ngụ ý rằng giá trị sẽ luôn luôn bằng không (nó chỉ có thể là may mắn). – user3784392

+3

Đặc tả C# rất cẩn thận không xác định giá trị defualt cho con trỏ. – Rawling

1

Tôi tin rằng con trỏ không có giá trị mặc định; do giá trị của con trỏ là địa chỉ của một phần bộ nhớ chứa thứ mà bạn gán cho nó. Nếu bạn chưa gán nó, nó có thể trỏ đến bất cứ thứ gì trong bộ nhớ.

Có lẽ hành vi mặc định của CLR là đặt thành IntPtr.Zero, "đại diện cho con trỏ hoặc xử lý đã được khởi tạo về 0", có vẻ như có khả năng từ câu trả lời của Carmelo Floridia. Điều này có vẻ là một chi tiết triển khai mà thông số kỹ thuật có thể chưa được xây dựng.

1

Giá trị mặc định của loại con trỏ theo thông số kỹ thuật là null. Đây là sau hai sự kiện.

Thực tế đầu tiên là con trỏ là loại tham chiếu. Nó được mô tả trong ECMA-335: enter image description here

Thực tế thứ hai là reference-type has default value - null.

+0

'Type.IsClass' trên con trỏ là' true' nhưng 'mặc định (typeof (void *))' là 'IntPtr.Zero', không null. Một trong hai loại tham chiếu không có giá trị mặc định là 'null' * luôn luôn * hoặc con trỏ không phải là loại tham chiếu. Tôi tin rằng đó là trước đây. – nawfal

+0

@nawfal 'IntPtr.Zero' được khởi tạo theo mặc định. Trường đầu tiên 'IntPtr.Zero' là' void không an toàn riêng * m_value'. Nếu 'void * m_value' là' IntPtr.Zero' thì chúng ta có sự giống nhau về đệ quy. –

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