2012-12-04 28 views
10

Tôi có hai phương pháp tiếp cận cho cùng một chức năng - một với điều kiện "nếu" và một với "?? và đúc" Những cách tiếp cận tốt hơn Tại saoĐiều kiện “If” có tốt hơn không? và đúc

Mã số:.?

Int16? reportID2 = null; 
    //Other code 

    //Approach 1 
    if (reportID2 == null) 
    { 
     command.Parameters.AddWithValue("@report_type_code", DBNull.Value); 
    } 
    else 
    { 
    command.Parameters.AddWithValue("@report_type_code", reportID2); 
    } 

    //Approach 2 
    command.Parameters.AddWithValue("@report_type_code", ((object) reportID2) ?? DBNull.Value); 

CẬP NHẬT

Dựa trên các câu trả lời, sau đây là những lợi ích của ??

  1. Tăng khả năng đọc
  2. Giảm phân nhánh của luồng chương trình (giảm thiểu cơn bão độ phức tạp oma)

Lưu ý: Chi phí truyền dưới dạng đối tượng là không đáng kể.

THAM KHẢO

  1. Null-Coallescing Operator - Why Casting?
+0

Tôi sẽ để lại các thẻ 'null-col-op',' performance' và 'casting'. – abatishchev

Trả lời

4

tôi luôn luôn sử dụng null-coalescing operator trong những trường hợp như vậy:

command.Parameters.AddWithValue("@name", value ?? DBNull.Value); 

command.ExecuteScalar() as int? ?? -1; 

, vv

Nó làm tăng đang reada bility, giảm độ sâu phân nhánh. Cũng được tạo ra đặc biệt cho các kịch bản liên quan đến cơ sở dữ liệu như ADO.NET.

+0

Tại sao bạn nghĩ điều đó tốt hơn? – Lijo

+0

Tại sao lại biên dịch? Sẽ không '??' phàn nàn về các loại không tương thích trên cả hai mặt? – CodesInChaos

+0

@CodesInChaos: Chắc chắn là không. Tôi chỉ còn lại để dễ đọc hơn. – abatishchev

10

Toán tử kết hợp rỗng (??) là cách tiếp cận tốt hơn vì nó hoạt động tương tự như khối ban đầu của bạn nhưng trong một dòng đơn, dễ đọc. Điều này làm cho mã dễ đọc hơn và dễ bảo trì hơn.

Đây là một trong nhiều ví dụ về đường cú pháp, tức là nói các câu lệnh mã là "phím tắt" để biểu diễn ý tưởng thường được sử dụng. i++ là một ví dụ khác, vì nó thay thế i = i + 1. Nó sạch hơn và đơn giản hơn, giống như ??.

+1

Xin lỗi nhưng bạn sai, một công tắc là một bảng nhảy không đơn giản nếu! Đó là lý do chỉ có những giá trị đơn giản được cho phép. –

+5

@FelixK .: Đối với trường hợp chuyển đổi nhỏ hơn 4 - nó chỉ là if-else (chưa được biên dịch bởi trình biên dịch) – abatishchev

+3

@FelixK. IMO chỉ là một chi tiết thực hiện. Trình biên dịch được phép chuyển nhiều 'if' thành một bảng nhảy và chuyển thành nhiều 'if'. – CodesInChaos

2

Trong ví dụ của bạn, cách tiếp cận 2 tốt hơn. Bạn should not repeat yourself và apprach 1 có mã và tên thông số hai lần. Nếu bạn muốn thay đổi tên paramater, bạn nên làm như vậy trên hai nơi, và đây là một rắc rối.

Mã thực để so sánh này để là thế này:

object value = DBNull.Value; 
if (reportID2 != null) 
{ 
    value = reportID2; 
} 
command.Parameters.AddWithValue("@report_type_code", value); 

Nếu bạn sử dụng này hoặc ?? điều hành là một vấn đề sở thích cá nhân. Tôi nghĩ rằng if rõ ràng hơn, đặc biệt là vì bạn cần dấu ngoặc đơn và truyền trong trường hợp của toán tử kết hợp.

+0

Hiệu suất-khôn ngoan mà là tốt hơn? Phương pháp tiếp cận 1 hoặc phương pháp tiếp cận 2? – Lijo

+4

Không. Bạn không nên lo lắng về hiệu suất trong trường hợp này. Sự khác biệt là không đáng kể. – Sjoerd

+0

Bạn có thể cải thiện câu trả lời của mình với các chi tiết sau nếu bạn đồng ý không? 1) Phương pháp 2 có thể đọc được nhiều hơn 2) AddWithValue luôn gây sát thương là đối tượng 3) Việc đúc đối tượng không tốn kém. – Lijo

0

Tôi thích toán tử ??. Mặc dù ngắn gọn không phải lúc nào cũng dẫn đến khả năng đọc tốt hơn, trong trường hợp này nó là vì người đọc bạn không phải so sánh những gì bằng nhau và khác nhau giữa hai dòng của ifelse. Hơn nữa, bạn loại bỏ trùng lặp mã (mà luôn luôn là tốt!). Hãy xem xét trường hợp bạn đổi tên tên trường cơ sở dữ liệu của bạn @report_type_code.Sau đó, bạn chỉ phải thay đổi nó ở một nơi.

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