2011-09-13 46 views
6

Lớp sau có hai phương pháp trong đó M1 khiếu nại "không phải tất cả đường dẫn mã trả về một giá trị 'và M2 không có.Câu hỏi chung C#

Câu hỏi: Trình biên dịch phân giải M2 như thế nào trong bối cảnh giá trị trả về? Làm thế nào NotImplementedException dụ là ngầm đúc như int (nếu có bất kỳ độ phân giải thời gian biên dịch nội bộ)

class A 
     { 
      int M1() 
      { 
      } 
      int M2() 
      { 
       throw new NotImplementedException(); 
      } 
     } 
+0

chung Seesharp (chào) SWeko

+0

Tôi dường như không thể tìm thấy ở đâu trong đặc điểm kỹ thuật C# quá trình này được mô tả, bất cứ ai có thể chỉ ra rằng? – SWeko

+1

@SWeko: Đã theo dõi nó xuống. Ở đây: http://msdn.microsoft.com/en-us/library/aa664437(VS.71).aspx (đoạn cuối). – Jon

Trả lời

7

Phương pháp không phải lúc nào cũng được yêu cầu trả về giá trị; đặc biệt, nó cũng được phép thoát bằng cách ném một ngoại lệ (trong trường hợp đó không có giá trị nào được trả về).

Edit: Cụ thể, the rules for the body of a method trả int là:

  1. Tất cả return báo cáo trong phương pháp này phải trả lại một biểu thức chuyển đổi thành int
  2. Sự kết thúc của khối phương pháp không phải là có thể truy cập

Trong ví dụ của bạn, trình biên dịch có thể chứng minh rằng M2 luôn thoát bằng cách ném , do đó, không thể truy cập vào cuối khối phương thức (tuân theo quy tắc số 2). Ngoài ra còn có không có tuyên bố return, cũng đáp ứng quy tắc số 1. Do đó đây là định nghĩa phương thức hợp lệ.

Mặt khác, M1 không đáp ứng quy tắc số 2 để nó không hợp pháp.

Bạn có thể bị nhầm lẫn bởi thông báo lỗi không đề cập đến, nhưng hãy xem xét rằng trong hầu hết các trường hợp phương pháp có giá trị trả về return thay vì ném - trình biên dịch chỉ cho bạn biết bạn có thể quên làm.

+0

aw để nhanh chóng cho pad phím WP7 của tôi. –

2

Trường hợp ngoại lệ ảnh hưởng đến dòng chảy của mã. Bất kỳ câu lệnh nào sau khi lệnh ném sẽ không được thực thi, trình biên dịch có thể chứng minh điều này rất hài lòng với đường dẫn thông qua phương thức.

Ngoại lệ sẽ không dẫn đến việc trả lại int, không có gì sẽ được trả lại theo nghĩa thông thường. Thay vào đó một ngoại lệ được tạo ra, CLR xử lý những điều này một cách khác nhau.

http://msdn.microsoft.com/en-us/library/ms173160(v=vs.80).aspx

0

Ngoại lệ sẽ không được truyền dưới dạng int. Trình biên dịch biết rằng nó là một ngoại lệ mà sẽ luôn luôn đạt được để không phàn nàn. Khi ngoại lệ được nhấn, nó sẽ giải phóng ngăn xếp đến một khối xử lý ngoại lệ hoặc sự cố. Một int sẽ không bao giờ được trả về cho người gọi phương thức.

0

Như đã nêu trong MSDN,

Tuyên bố ném được dùng để báo hiệu sự xuất hiện của một tình huống bất thường (ngoại lệ) trong thời gian thực hiện chương trình.

Khi mã thực hiện chạy vào ném tuyên bố, chương trình được dừng lại và một thông báo ngoại lệ được chứng minh là một người sử dụng (nếu một lập trình viên không chỉ định bất kỳ lỗi xử lý logic)