2011-12-18 44 views
11

Tôi nhận được một số dữ liệu từ máy khách dưới dạng json. Tôi đang viết này:.Trim() khi chuỗi rỗng hoặc rỗng

string TheText; // or whould it be better string TheText = ""; ? 
TheText = ((serializer.ConvertToType<string>(dictionary["TheText"])).Trim()); 

Nếu biến đó được phân tích cú pháp từ json trở lại trống rỗng, không đụng mã này khi tôi gọi phương thức .Trim()?

Cảm ơn.

+2

Vâng, nó sẽ sụp đổ nếu đó là null. .. – BoltClock

+19

(myValue ?? "") .Trim() allways sẽ hoạt động. – Larry

+8

Với C# 6.0 bây giờ chúng ta có thể sử dụng các toán tử null có điều kiện, như theText? .Trim() – Santosh

Trả lời

17

Nếu serializer trả về một chuỗi rỗng, Trim sẽ không làm gì cả.

Nếu bộ nối tiếp trả về null, bạn sẽ nhận được NullReferenceException khi gọi tới Trim.

Mã của bạn sẽ được viết tốt hơn (như xa như khởi tạo là có liên quan) như thế này:

string theText = 
      ((serializer.ConvertToType<string>(dictionary["TheText"])).Trim()); 

Không có điểm nào trong tuyên bố và khởi tạo biến và ngay lập tức gán cho nó.

Sau đây sẽ là an toàn nhất, nếu bạn không biết những gì serializer có thể quay trở lại:

string theText = ((serializer.ConvertToType<string>(dictionary["TheText"]))); 

if(!string.IsNullOrEmpty(theText)) 
{ 
    theText = theText.Trim(); 
} 
+1

ok, điều đó làm cho sự rõ ràng hơn. – frenchie

+0

Nếu bạn đã phải cắt tải các trường mặc dù, đây là một nỗi đau, là không có cách nào để mở rộng phương pháp cắt để không bận tâm nếu chuỗi là null? – JsonStatham

+1

@SelectDistinct - bạn luôn có thể viết một phương thức mở rộng thực hiện chính xác điều đó. – Oded

2

Thứ nhất, không, nó sẽ không tốt hơn để khởi tạo TheText đến "". Bạn đang gán cho nó ngay sau đó. (Và nếu bạn cần sử dụng một chuỗi rỗng, hãy sử dụng string.Empty để thay thế. Nó thường rõ ràng hơn và chỉ là thực hành tốt hơn.)

Thứ hai, không, nó sẽ không bị lỗi - Trim() hoạt động tốt trên một chuỗi trống . Nếu bằng "trống", bạn có nghĩa là nó có thể là null, sau đó có, nó sẽ sụp đổ; bạn có thể khắc phục điều đó bằng cách sử dụng các nhà điều hành null-liên hiệp:

string TheText = (serializer.ConvertToType<string>(dictionary["TheText"]) ?? string.Empty).Trim(); 
+3

Tôi không nghĩ có thỏa thuận chung là 'string.Empty' tốt hơn' "" '. Tôi cho một người thích '" "'. – CodesInChaos

+0

@CodeInChaos: Không, không có thỏa thuận chung. Đó là chủ yếu là ý kiến, nhưng có thể có một số bằng khen cho [đối số hiệu quả] (http://stackoverflow.com/questions/5650164/why-string-empty-is-more-recommended-than). Nhưng đó chỉ là một gợi ý. – Ryan

+2

Tôi khá chắc chắn không có giá trị nào đối với đối số hiệu quả của .net 4. Kiểm tra của tôi cho thấy rằng '' '' và 'string.Empty' chỉ cùng một cá thể, và cá thể đó được chia sẻ trên AppDomains. Có thể có một sự khác biệt khi sử dụng NGen, nhưng ít nhất là cho các chương trình bình thường, tôi không thể tìm thấy bất kỳ sự khác biệt kỹ thuật nào giữa hai chương trình đó. – CodesInChaos

10

Calling Trim() về một chuỗi rỗng sẽ dẫn đến một chuỗi rỗng.Gọi Trim() trên null sẽ ném NullReferenceException

+0

cách sạch nhất để kiểm tra 'string.IsNullOrEmptyOrBlank' là gì? – Coops

+0

@CodeBlend: Bạn có ý nghĩa gì khi bỏ trống? –

+2

Aha - [String.IsNullOrWhiteSpace] (http://msdn.microsoft.com/en-us/library/system.string.isnullorwhitespace.aspx) – Coops

9

Nếu bạn có một vài lĩnh vực mà bạn muốn cắt nhưng nhận được ngoại lệ của bạn đối với những hồ sơ mà có null trong các lĩnh vực nhất định, sau đó viết một phương pháp mở rộng nhanh chóng sẽ là phương pháp đơn giản nhất:

public static class ExtensionMethods 
    { 
     public static string TrimIfNotNull(this string value) 
     { 
      if (value != null) 
      { 
       return value.Trim(); 
      } 
      return null; 
     } 
    } 

mẫu ví dụ về sử dụng:

string concatenated = String.Format("{0} {1} {2}", myObject.fieldOne.TrimIfNotNull(), myObject.fieldTwo.TrimIfNotNull(), myObject.fieldThree.TrimIfNotNull()); 
2

Như đã đề cập trong một số ý kiến, bây giờ bạn có thể sử dụng C# 6 nhà khai thác Null-có điều kiện với cú pháp này:

string TheText = (serializer.ConvertToType<string>(dictionary["TheText"]))?.Trim(); 

Tài liệu: https://msdn.microsoft.com/en-us/library/dn986595.aspx

5

Bạn có thể sử dụng elvis điều hành:

GetNullableString()?.Trim(); // returns NULL or trimmed string 
+0

https://en.wikipedia.org/wiki/Elvis_operator cho những người không biết ý nghĩa của Elvis?: –

0

Bạn có thể sử dụng mã này như beblow

string theText = (((serializer.ConvertToType<string>(dictionary["TheText"])))+ string.Empty).Trim(); 
Các vấn đề liên quan