2011-09-02 28 views
7

Giả sử bạn đang gỡ lỗi. Tại một thời điểm bạn đang ở Phương pháp A, có một thông số foo thuộc loại Foo. Sau đó, bạn đang ở trong Phương pháp B, cũng có một tham số foo thuộc loại Foo.Làm thế nào để xác định bình đẳng tham chiếu của hai biến trong phạm vi khác nhau?

Hai biến này có thể giống với phiên bản Foo giống nhau, nhưng làm cách nào để bạn biết? Vì chúng nằm trong phạm vi khác nhau, bạn không thể gọi số ReferenceEquals(). Có cách nào bạn có thể có được vị trí bộ nhớ thực tế mà các biến trỏ tới để bạn có thể biết được chúng là cá thể không?

Trả lời

6

Tôi tin rằng bạn có thể sử dụng tính năng Make Object ID. Thông tin thêm về điều này có thể được tìm thấy here, nhưng để tóm tắt:

  1. Đặt BreakPoint trong mã của bạn nơi bạn có thể đến một biến đối tượng nằm trong phạm vi.
  2. Chạy mã của bạn và để mã dừng tại BreakPoint.
  3. Trong Cửa sổ địa phương hoặc ô tô, nhấp chuột phải vào biến đối tượng (lưu ý cột Giá trị) và chọn "Đặt ID đối tượng" từ trình đơn ngữ cảnh.
  4. Bây giờ bạn sẽ thấy số ID mới (#) mới trong cột Giá trị.

Sau khi bạn "đánh dấu" đối tượng, bạn sẽ thấy ID được chỉ định trong cuộc gọi thứ hai tới Foo.

+0

Rất đẹp. Điều đó có sẵn trong các phiên bản cũ của VS hoặc là một điều mới? – Chris

+0

@Chris - Tôi không có VS2008 nằm xung quanh ngay bây giờ, nhưng trang cho biết nó được hỗ trợ trong năm 2008 và 2010. Tôi đã xác minh điều này trong VS2010. – CodeNaked

+0

Vâng, xin lỗi. Tôi chỉ mới nhận ra rằng sau khi tôi hỏi. :( – Chris

1

Trong khi trong trình gỡ lỗi, bạn có thể lưu trữ tham chiếu đến đối tượng trong phương thức đầu tiên vào trường tĩnh và sau đó so sánh biến trong phương thức thứ hai với trường tĩnh.

+1

Cảm ơn đề xuất. Bạn có nghĩa là bạn sẽ phải tạo một trường tĩnh trong mã trước khi gỡ lỗi để nhận được giá trị? Một chút xâm nhập có thể ... – David

+0

Có, bạn phải làm điều đó. –

0

bạn cũng có thể lấy con trỏ đến biến của mình nhưng điều này đòi hỏi phải chạy trong một khối không an toàn.

khi bạn là "unsafed" bạn có thể khai báo một con trỏ đến Foo của bạn như thế này:

Foo* p = &myFoo; 

này đã được đã thảo luận ở đây trong SO:

C# memory address and variable

0

Như một sự phát triển của đề nghị Đánh dấu Cidade, khi bên trong phương pháp đầu tiên gõ như sau vào cửa sổ ngay lập tức:

var whatever = foo; 

Sau đó, khi trong phương pháp thứ hai, gõ như sau:

bool test = object.ReferenceEquals(whatever, foo); 

Cửa sổ ngay lập tức sẽ hiển thị kết quả của thử nghiệm.

Tuy nhiên, đề xuất của CodeNaked là tốt hơn.

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