2009-03-12 8 views
51

Bài viết MSDN trên String Basics thấy điều này:Tại sao thêm null vào chuỗi hợp pháp?

string str = "hello"; 
string nullStr = null; 
string emptyStr = ""; 

string tempStr = str + nullStr; // tempStr = "hello" 
bool b = (emptyStr == nullStr);// b = false; 
string newStr = emptyStr + nullStr; // creates a new empty string 
int len = nullStr.Length; // throws NullReferenceException 

Tại sao không concatenating với null ném một ngoại lệ tham chiếu null? Liệu nó có làm cho cuộc sống của một lập trình viên dễ dàng hơn, sao cho họ không phải kiểm tra null trước khi nối?

Trả lời

51

Từ MSDN:

Trong hoạt động nối chuỗi, C# biên dịch xử lý một chuỗi rỗng giống như một chuỗi rỗng, nhưng nó không chuyển đổi giá trị của chuỗi rỗng ban đầu.

Thông tin thêm về các + binary operator:

Toán tử + nhị phân thực hiện chuỗi nối khi một hoặc cả hai toán hạng là kiểu string.

Nếu toán tử của chuỗi nối là null, một chuỗi rỗng được thay thế. Nếu không, bất kỳ đối số không phải chuỗi nào là được chuyển đổi thành biểu diễn chuỗi bằng cách gọi phương thức ToString ảo được kế thừa từ đối tượng loại.

Nếu ToString trả về null, một chuỗi trống được thay thế.

+0

Câu hỏi cuối cùng là về lý do thiết kế ngôn ngữ. Một số người đã cố gắng đoán các câu trả lời khác. Chúng tôi cần một người từ MS để trả lời ở đây. –

+0

Lựa chọn tuyệt vời của nhóm C# khi nó bật ra để hoạt động như một nét duyên dáng với toán tử điều kiện null không có điều kiện C# 6, đặc biệt khi kết hợp với các tính năng nội suy chuỗi C# 6: ví dụ: 'return $" {person? .FirstName} {person? .LastName} "' – GDS

0

Lý do nó không ném ngoại lệ tham chiếu null là vì bạn không thực sự cố truy cập bất kỳ thuộc tính hoặc phương thức nào trên đối tượng null. Khi báo giá CMS, khi chuỗi ghép nối, các giá trị rỗng được thay thế bằng các chuỗi rỗng.

+0

Điều này có nghĩa là gì, không * tại sao * nó thực hiện điều này. –

1

Tôi đoán các nhà thiết kế ngôn ngữ (hoặc thư viện chuẩn) đã quyết định đây sẽ là một trường hợp đủ phổ biến mà họ sẽ làm người lập trình ủng hộ.

(Neat! Tôi luôn luôn chỉ là giả định concating với null sẽ thông qua một ngoại lệ!)

3

Về mặt lý thuyết, dây thường được coi là giá trị như trái ngược với tham chiếu đến các đối tượng có bản sắc. Một trong những lý do chính khiến chúng không phải là struct s với ngữ nghĩa giá trị là do phí trên cùng với việc sao chép khi chuyển nhượng. Nếu chuỗi giá trị chúng không thể vô hiệu và do đó, null chỉ được xử lý bởi toán tử "+" như thể nó là một chuỗi rỗng (tức là, như là default(string) == "" giống như default(int) == 0).

6

Tôi đồng ý rằng chuỗi khái niệm chỉ là giá trị. Tuy nhiên, hãy xem xét mã sau đây:

int? i = null; 
i += 1; // The result of this is that i == null 

Nếu toán tử loại giá trị khác sử dụng giá trị mặc định() cách mà toán tử chuỗi chuyển đổi thành null ", lời giải thích của bạn sẽ có ý nghĩa.

Đơn giản nhất để nói rằng các toán tử chuỗi là một phím tắt (trường hợp đặc biệt) để thuận tiện.