2012-10-16 70 views
5

Tại sao tôi luôn cần chỉ định giá trị cho biến chuỗi, trước khi thực sự sử dụng giá trị đó để so sánh. Đối với ví dụ: Một số đầu vào - objTại sao gán giá trị cho chuỗi trước khi so sánh, khi mặc định là null

 string temp; 
     if (obj== null) 
     { 
      temp = "OK"; 
     } 
     string final = temp; 

tôi nhận được biên dịch lỗi thời gian - một cái gì đó giống như - không thể sử dụng biến unassigned 'tạm thời'. Nhưng biến chuỗi có giá trị mặc định là 'null', mà tôi muốn sử dụng. Vậy tại sao điều này lại không được phép?

Trả lời

7

khi mặc định là null

Mặc định là không null (hoặc bất cứ điều gì khác) cho một biến địa phương. Nó chỉ là chưa được gán.

Có thể bạn đang nghĩ về một trường chuỗi (một biến ở cấp lớp). Đó sẽ là null:

private string temp; 

private void M() 
{ 
    if (obj== null) 
    { 
     temp = "OK"; 
    } 
    string final = temp; // default tnull 
} 

Nhưng bên trong một phương pháp, chỉ cần khởi tạo với giá trị mà bạn cần:

string temp = null; 
+0

Btw, ghi chú kỹ thuật nhanh. Bởi vì C# biên dịch thành IL, và phương thức mức IL là dựa trên stack, các biến kỹ thuật không tồn tại trừ khi chúng được gán. Trong khi trình gỡ lỗi có thể cho bạn biết rằng một biến chưa được gán bằng '0' hoặc một cái gì đó, trong hầu hết các trường hợp, đây chỉ là một phép lịch sự. Nó sẽ chỉ được tạo sau này. – GregRos

+0

@GregRoss - và khi nó được tạo, tôi tin rằng nó là 'mặc định (T)', 'null' trong trường hợp này. Nhưng không thể quan sát được lập trình viên C#. –

+0

Không chính xác. Trong IL, một biến không thể được khai báo mà không có một giá trị rõ ràng mà nó có thể được gán. Để gán một biến cho 'default (T)' (hoặc 'null'), trước tiên bạn sẽ cần lấy giá trị này bằng cách sử dụng một lệnh rõ ràng, và chỉ sau đó phân bổ nó. Trong thực tế, IL tạo ra từ C# không bao giờ làm điều này. Trong khi bạn có thể nghĩ rằng bạn đã khai báo một biến, IL thường không khai báo nó cho đến khi nó có giá trị xác định để gán. – GregRos

2

Sau đó assing null như mặc định cho biến cục bộ của bạn:

string temp = null; 

Đó là chỉ là một gợi ý trình biên dịch mà bạn có thể đã quên gán một giá trị. Bằng cách chỉ định rõ ràng null bạn đang nói với trình biên dịch mà bạn đã nghĩ về nó. .

C# Ngôn ngữ đặc tả v 4,0 phần 1.6.6.2 "Phương pháp cơ thể và các biến địa phương" khẳng định như sau:

Một cơ thể phương pháp có thể khai báo các biến đó là đặc trưng cho ước nguyện của phương pháp. Các biến này được gọi là biến cục bộ. ... C# yêu cầu biến cục bộ là chắc chắn được gán trước khi giá trị của nó có thể nhận được.

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