2011-01-07 31 views
12

Có thể hỏi câu hỏi phản bội sự thiếu hiểu biết của tôi về quy trình, nhưng sau đó một lần nữa, không có lý do nào tốt hơn để hỏi!Tại sao không phản đối ngoại lệ lỗi tham chiếu trong .net cho tôi biết đối tượng nào là null?

Theo dõi những điều này có thể gây phiền toái vì các dấu vết ngăn xếp có thể giúp tôi biết bắt đầu tìm kiếm ở đâu nhưng không phải đối tượng nào là rỗng.

Điều gì đang xảy ra dưới mui xe ở đây? Có phải vì tên biến không được nhóm trong tệp thi hành không?

+0

Vâng, nó thực sự khó chịu. Tôi cũng muốn biết. –

+0

Bạn biết đấy, tôi chưa bao giờ nghĩ về điều đó - câu hỏi hay! –

Trả lời

5

mã NET xây dựng với tối ưu hóa đầy đủ và không có thông tin gỡ lỗi: tên biến địa phương của bạn đã mất hết, một số các biến cục bộ có thể được loại bỏ hoàn toàn.

mã NET xây dựng với tối ưu hóa đầy đủ + PDB (hoặc debug đầy đủ): hầu hết các tên biến cục bộ bảo quản, một số biến địa phương có thể được loại bỏ

Không tối ưu hóa + không thông tin gỡ lỗi: tên biến địa phương đã mất hết. Sau đó chúng ta phải xem xét rằng bất cứ điều gì bạn đang xử lý có thể không ở trong một biến cục bộ - nó có thể là kết quả của một cuộc gọi hàm trước đó, trên đó bạn đang gọi một cuộc gọi hàm mới.

0

Không có "mã định danh đối tượng". Không có cách nào mà .NET có thể nói "đối tượng có mã định danh xxxx là null".

Bạn sẽ tìm hiểu cách không mắc các lỗi này, đừng lo lắng. Chỉ cần phá vỡ các biểu thức của bạn thành các phần nhỏ hơn, và bạn sẽ tìm thấy các đối tượng mà bạn quên khởi tạo. Bạn sẽ học cách iniitialize chúng trong kịch bản đó, và sau một thời gian, trường hợp đó sẽ không xảy ra nữa.

+0

"Bạn sẽ học cách không phạm những sai lầm này, đừng lo lắng." Hahahahahahaha! Chưa. Có ai khác đã ngừng phạm những sai lầm này không? – jrsconfitto

1

Về cơ bản, bạn đã trả lời câu hỏi của riêng mình. Khi mã của bạn được biên dịch, nó được chuyển đổi thành ngôn ngữ trung gian (IL). IL không có tên biến theo cách mã của bạn làm, các đối số cho một phương thức được gọi là được đẩy vào ngăn xếp trước khi phương thức được gọi và các đối số phương thức dòng và biến cục bộ được tham chiếu bởi vị trí đó. Tôi tin rằng điều này là bởi vì cấu trúc này hỗ trợ trình biên dịch JIT tạo mã.

Tệp ký hiệu pdb lưu trữ ánh xạ giữa IL được tạo và mã của bạn. Nó được sử dụng để cho bạn biết dòng nào trong mã của bạn mà mỗi phương thức gọi trong ngăn xếp cuộc gọi đề cập đến. Có thể thông tin được lưu trữ ở đây không đủ chi tiết để nói biến nào là null, hoặc có thể nó chỉ được coi là quá đắt về mặt perf khi có thể làm được điều này. Trong mọi trường hợp, nếu bạn đã cho phép trình biên dịch tối ưu hóa IL được tạo ra thì có thể không còn là một ánh xạ một giữa các biến trong IL và các biến trong mã của bạn nữa.

Hy vọng rằng sẽ giúp, Rob

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