2010-08-31 29 views
14

Mã này là không hợp lệ:C# 4.0 - Làm thế nào để xử lý chuỗi tùy chọn thông số

private void Foo(string optionalString = string.Empty) 
{ 
    // do foo. 
} 

Nhưng mã này là:

private void Foo(string optionalString = "") 
{ 
    // do foo. 
} 

Tại sao? Vì string.Empty là một trường chỉ đọc, không phải là một hằng số và các giá trị mặc định cho các tham số tùy chọn phải là một hằng số biên dịch-thời gian.

Vì vậy, vào câu hỏi của tôi ... (tốt, mối quan tâm)

Đây là những gì tôi đã làm:

private const string emptyString = ""; 

private void Foo(string optionalString = emptyString) 
{ 
    // do foo. 
    if (!string.IsNullOrEmpty(optionalString)) 
     // etc 
} 

Làm thế nào để các bạn xử lý các thông số chuỗi bắt buộc?

Tại sao họ không thể tạo String.Empty hằng số biên dịch?

+2

tại sao không dính với ""? Đó là tất cả những gì tôi từng làm, nhưng đó cũng là vì tôi không hiểu lợi thế của việc sử dụng String.Empty. Phải là một điều unicode, nhưng tôi không bao giờ phải lo lắng về điều đó (ít nhất là chưa ... yikes) – Dave

+1

Tôi nhầm lẫn lý do tại sao bạn nghĩ rằng bạn * cần * để làm điều này. Tôi cho rằng 'nullString' là một cái tên khó hiểu, bởi vì ngay từ cái nhìn đầu tiên tôi có khuynh hướng nghĩ rằng nó là' null', không phải '" "'. Đối với câu hỏi cuối cùng của bạn, hãy xem [ Tại sao không phải là String.Empty một hằng số? ] (http://stackoverflow.com/questions/507923/why-isnt-string-empty-a-constant). @ Dave, không có điều Unicode, ở đây. '" "' là tốt; xem thêm [ Trong C#, tôi có nên sử dụng string.Empty hoặc String.Empty hoặc “” không? ] (http://stackoverflow.com/questions/263191/in-c-should-i-use-string-empty-or-string-empty-or). –

+0

Vui lòng đề cập đến phiên bản. – PrateekSaluja

Trả lời

10

Ummm ... có gì sai với chuỗi tùy chọnParm = "" một lần nữa? Tại sao điều đó xấu? Bạn có thực sự nghĩ rằng bạn cần một hằng số tượng trưng cho một chuỗi rỗng trong trường hợp này? Thế thì sao?

const int Zero = 0; 

void SomeMethod(int optional = Zero) { } 

Điều đó có vẻ ngớ ngẩn với bạn không?

+1

Đồng ý, tôi đặt tên là xấu. Tôi chỉ có sử dụng để sử dụng string.empty cho hầu hết các hoạt động chuỗi, rằng khi tôi bắt đầu sử dụng Params tùy chọn, tôi didnt như thực tế tôi đã phải quay trở lại "". Đoán bị bệnh với "". – RPM1984

+0

Chế độ tiện lợi: Nếu bạn muốn mọi người đọc mã của bạn là 'không' thay vì 'không' thì có thể nó là OK – Davos

+3

Tại sao lại có phản ứng thô lỗ như vậy? OP có một câu hỏi hợp pháp. – webworm

2

Cách tốt nhất để xử lý chúng là với:

private void Foo(string optionalString = "") 
{ 
    // do foo. 
} 

Vì vậy, bạn không thể sử dụng String.Empty. Mọi người đều nhận ra "", nhưng nếu tôi tìm thấy optionalString = nullString Tôi sẽ không chắc chắn nên nghĩ gì. Nếu không có gì khác, hãy đặt tên cho điều emptyString - nó không phải là rỗng!

+1

Đồng ý, tôi đặt tên là xấu. Tôi chỉ có sử dụng để sử dụng string.empty cho hầu hết các hoạt động chuỗi, rằng khi tôi bắt đầu sử dụng Params tùy chọn, tôi didnt như thực tế tôi đã phải quay trở lại "". Đoán bị bệnh với "". – RPM1984

0

Tôi đang trả lời câu hỏi này.

Why can they not make String.Empty a compile-time constant?

Đây là mã tháo rời qua Reflector của String.cs trong mscorlib.dll

public static readonly Empty; 
static String() 
{ 
    Empty = ""; 
    WhitespaceChars = new char[] { 
     '\t', '\n', '\v', '\f', '\r', ' ', '\x0085', '\x00a0', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 
     ' ', ' ', ' ', ' ', '​', '\u2028', '\u2029', ' ', '' 
    }; 
} 

Vì vậy, trong nền tảng cửa sổ, string.Empty là chính xác "". Nhưng bạn có biết, sao Hỏa có một định nghĩa khác cho Empty và WhitespaceChars trong hệ điều hành của họ.

4

nếu bạn không thích giá trị "", bạn có thể sử dụng giá trị mặc định (chuỗi).
Tôi đã chơi với nó và nó được cho phép.

private static void foo(string param = default(string)) { 
    if (!string.IsNullOrEmpty(param)) // or param != default(string) 
     Console.WriteLine(param); 
} 
+6

Giá trị mặc định (chuỗi) là null, không phải chuỗi rỗng. – allonhadaya

+0

@allonhadaya, chỉ định giá trị mặc định không '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '. – binki

+0

@binki, tôi không chắc tôi hiểu điểm của bạn. Ý anh là gì? – allonhadaya

0

Nếu bạn sẵn sàng để chơi mất và điều trị null, "", và ký tự khoảng trắng để được như vậy, thì bạn có thể mặc định null. Điều này trở nên rất hữu ích khi tên người dùng và mật khẩu là các trường tùy chọn do khả năng kết nối đáng tin cậy với một db. Bạn có thể thay đổi logic này để đặt lại các chuỗi thành null và do đó sửa đổi xác nhận và if. Phần quan trọng là có một quy ước nhất quán.

private void RunSql(string serverName, string databaseName, string userName = null, string password = null) 
{ 
    userName = Strip(userName); 
    password = Strip(password); 

    // The `MsTest` assert - works in both `Debug` and `Release` modes. 
    Assert.AreEqual<bool>(
     userName == String.Empty, 
     password == String.Empty, 
     "User name and password should be either both empty or both non-empty!"); 
    Assert.IsFalse(String.IsNullOrWhiteSpace(serverName)); 
    Assert.IsFalse(String.IsNullOrWhiteSpace(databaseName)); 

    var cmdBuilder = new StringBuilder(); 
    cmdBuilder.AppendFormat("sqlcmd -E -S {0} -d {1} ", serverName, databaseName); 
    if (userName.Length > 0) 
    { 
     cmdBuilder.AppendFormat("-U {0} -P {1} ", userName, password); 
    } 

    // Complete the command string. 
    // Run the executable. 
} 

// Cannot think of a good name. Emptify? MakeNullIfEmpty? 
private string Strip(string source) 
{ 
    if (String.IsNullOrWhiteSpace(source)) 
    { 
     return String.Empty; 
    } 

    return source; 
} 
1

Code Analysis warning 1026 không nên sử dụng tham số tùy chọn.Đó là cách tốt hơn để sử dụng các phương pháp quá tải, như sau:

private void Foo() 
{ 
    Foo(string.Empty); 
} 
private void Foo(string optionalString) 
{ 
    // do foo. 
    if (!string.IsNullOrEmpty(optionalString)) 
     // etc 
} 
Các vấn đề liên quan