2012-04-24 41 views
15

có rất nhiều lần, trong đó tôi có một văn bản đầu vào,C# chuỗi rỗng -> null?

và nếu có sản phẩm nào của nó (người dùng didnt gõ bất kỳ văn bản) - tôi muốn gửi đến các truy vấn DB "null"

khôngString.Empty. (hoặc "")

vì vậy tôi tìm thấy bản thân tôi đây làm rất nhiều:

var mySqlValue = string.IsNullOrEmpty(tbCustomerId.Text)?null:tbCustomerId.Text; 

này có vẻ xấu xí với tôi.

.net cung cấp cho rất nhiều giải pháp khác cho các kịch bản ngược lại:

 string.IsNullOrEmpty 
     string.IsNullOrWhiteSpace 
     myProblemVal ?? myDefultVal 

Tôi biết điều này có thể được giải quyết bằng phương pháp mở rộng - và tôi biết làm thế nào để làm điều đó ..

nhưng có điều gì tốt hơn không?

có bất kỳ mã thông minh nào cho: "if its empty -> null".

+0

Ngoài ra còn có vấn đề sau: Nếu '.Text' là thuộc tính (tức là một cuộc gọi đến accessor' get'), lần đầu tiên getter được gọi, nó có thể trả về một chuỗi dài, nói "John Doe" '. Chúng ta có thể đánh giá "thành phần" cuối cùng của toán tử điều kiện bậc ba '?:'. Nhưng điều này gọi hàm getter 'Text' một lần nữa, và lần này nó có thể trả về' "" '. Vì vậy, trong priciple bạn phải lấy một bản sao biến cục bộ của 'Text'. Điều này là không cần thiết, tất nhiên, nếu bạn sử dụng một phương pháp mở rộng. –

+0

Nếu bạn sử dụng một phương pháp mở rộng, bạn có thể 'Trim()' chuỗi đầu tiên trước khi kiểm tra, đó là khó khăn để làm trong biểu thức duy nhất. – toddmo

Trả lời

5

nhưng có gì tốt hơn không?

Không, mặc dù tôi cho rằng những gì bạn mô tả trong câu hỏi (phương pháp khuyến nông) hoàn toàn ổn. Và như bạn mô tả trong câu hỏi, theo một hướng khác, bạn có sự hợp nhất vô giá trị.

+0

tôi sẽ rất vui khi được nghe và tìm hiểu những gì không phải là 'hoàn toàn tốt' –

+0

@Royi ??? bối rối; một phương pháp mở rộng không phải là xấu xí ở đây ... –

+0

@Royi Tôi có nghĩa là phương pháp mở rộng phương pháp - Tôi đã làm rõ rằng –

17

Bạn có thể sử dụng một phương pháp khuyến nông:

public static class Extensions { 
    public static string NullIfWhiteSpace(this string value) { 
     if (String.IsNullOrWhiteSpace(value)) { return null; } 
     return value; 
    } 
} 

Mà bạn có thể sử dụng như thế:

var mySqlValue = tbCustomerId.Text.NullIfWhiteSpace(); 

tôi không thực sự biết những gì bạn tưởng tượng của một cái gì đó tốt hơn so với các phương pháp mở rộng. Làm thế nào để bạn xác định "tốt hơn"? Ngắn hơn? Sử dụng một từ khóa đặc biệt? Sử dụng các nhà khai thác hiếm khi được sử dụng để trông thông minh? Điều này đã được chỉ là một cuộc gọi phương thức duy nhất nối vào giá trị của bạn, mà thậm chí làm việc trên các giá trị null, và logic bạn cần không thể thực sự được thể hiện trong một cách ngắn hơn này. Ngoài ra, tôi không biết bất kỳ cú pháp đặc biệt nào cho nó.

+0

i explictly đã viết 'Tôi biết điều này có thể được giải quyết bằng cách mở rộng phương pháp - và tôi biết làm thế nào để làm điều đó..' - là có bất cứ điều gì tốt hơn –

+0

oops, không nhìn thấy một phần :) Nhưng tôi không thấy một thanh lịch hơn đường. – Botz3000

+5

Mặc dù anh ấy nói anh ấy biết, đây có lẽ là cách tốt nhất thay vì toàn bộ nhóm nếu nếu – Matthew

3

Khai báo phương thức tĩnh của riêng bạn:

public static string NullIfEmpty(string value) 
{ 
    return string.IsNullOrEmpty(value) ? null : value; 
} 

Làm

MyHelper.NullIfEmpty (giá trị) không phải là xấu xí hơn một cuộc gọi đến một phương pháp tĩnh kiểu string ... Và có vẻ sạch hơn bằng văn bản "string.IsNullOrEmpty (tbCustomerId.Text)? null: tbCustomerId.Text" mỗi lần.

+3

Hehe, nếu bạn đặt phương thức này trong lớp tĩnh và sử dụng từ khóa 'this' này, bạn có thể sử dụng nó như một phương thức mở rộng ;) - Ngắn hơn nhiều để viết – Matthew

+4

bạn ít nhất có thể làm cho nó một phương pháp mở rộng, không? –

+0

Tất nhiên bạn có thể làm cho một phương pháp mở rộng nhưng tôi không thực sự thích nó, đặc biệt là về tài liệu tham khảo null. Lựa chọn cá nhân. – Guillaume

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