2010-10-21 8 views
7

khi triển khai/sử dụng các phương thức trả về hoặc làm việc với các đối tượng của đối tượng, cách tiếp cận thanh lịch nhất để kiểm tra tham số chức năng là gì?Cách tốt nhất để kiểm tra tham số chức năng: Kiểm tra null hoặc try/catch

Cách gọi:

someType GetSomething(object x) 
{ 
    if (x == null) { 
     return; 
    } 

    // 
    // Code... 
    // 
} 

hoặc tốt hơn:

someType GetSomething(object x) 
{ 
    if (x == null) { 
     throw new ArgumentNullException("x"); 
    } 

    // 
    // Code... 
    // 
} 

Calling Phương pháp:

void SomeOtherMethod() 
{ 
    someType myType = GetSomething(someObject); 

    if (someType == null) { 
     return; 
    } 

} 

hoặc tốt hơn:

void SomeOtherMethod() 
{ 
    try { 
     someType myType = GetSomething(someObject); 
    } catch (ArgumentNullException) { 
    } 
} 

Khi duyệt qua các câu hỏi tương tự, lý do không sử dụng try/catch là hiệu suất. Nhưng IMHO thử-catch chỉ trông tốt hơn :).

Vì vậy, cách nào là "thanh lịch" hơn?

Trả lời

8

Nếu vượt qua trong null không hợp lệ, hãy ném ngoại lệ (nghĩa là - đây là một tình huống đặc biệt nên không bao giờ xảy ra xảy ra).

Nếu tham số null hợp lệ, trả lại đối tượng tương ứng.

Nói chung, chấp nhận null thông số là xấu thực hành - nó đi ngược lại các nguyên tắc nhất bất ngờ và đòi hỏi người gọi để biết nó là hợp lệ.

+0

Có chức năng sẽ đánh giá đầu vào không null và trả về giá trị null cho đầu vào rỗng, thường là mẫu hữu ích. Trong một số trường hợp, Mô hình đối tượng Null có thể đẹp hơn, nhưng có thể khó thực hiện với các thuốc generic. – supercat

2

Bạn chỉ nên sử dụng ngoại lệ cho các trường hợp ngoại lệ. Nếu bạn mong đợi đối số có thể là (hợp pháp) null, bạn nên kiểm tra nó - không sử dụng ngoại lệ cho điều đó. IMO bạn nên kiểm tra null tại trang web gọi điện thoại (trước khi yêu cầu) nếu nó không có ý nghĩa để chuyển null vào phương thức của bạn.

0

Trong ví dụ GetSomthing của bạn là riêng tư. Điều này có nghĩa là bạn có thể theo dõi tất cả người gọi và đảm bảo rằng các giá trị Null không được chuyển vào ví dụ:

if (x != null) 
    someType myType = GetSomthing(x) 
else 
    // Initialize x or throw an InvalidOperation or return whatever is correct 

Tuy nhiên nếu không thực sự riêng tư thì bạn nên làm như Oded và những người khác nói. Kiểm tra xem nếu nó null và ném một ArguementExecption trong hầu hết các trường hợp.

4

Theo như sự thanh lịch, bạn khó có thể đứng đầu Code Contracts.

Contract.Requires(x != null);