C# langauge yêu cầu tất cả các biến chắc chắn phải được gán trước khi chúng được đọc. Biến cục bộ được coi là ban đầu chưa được gán, trong khi các trường, thành phần mảng, v.v. được coi là ban đầu được gán cho giá trị mặc định. Không có lý do kỹ thuật nào tại sao chúng ta không thể xử lý các biến cục bộ như ban đầu được gán cho các giá trị mặc định của chúng và vứt bỏ tất cả việc kiểm tra phân định xác định. Nó có bởi vì sử dụng một địa phương chưa được gán làm giá trị mặc định của nó là (1) một thực hành mã hóa xấu, và (2) một nguồn có khả năng gây ra các lỗi kích thích cao.Bằng cách yêu cầu bạn chỉ định rõ ràng biến cục bộ trước khi chúng được sử dụng, chúng tôi ngăn người dùng sử dụng thực hành không tốt và loại bỏ toàn bộ lớp lỗi mà bạn không bao giờ phải gỡ lỗi.
Ngoài ra, hãy xem xét những điều sau đây:
while(whatever)
{
int i;
print(i);
i = i + 1;
}
Bạn có mong đợi tôi để giữ giá trị của nó trên khắp hành của vòng lặp, hoặc cho nó được khởi tạo trong lành về không mỗi lần? Bằng cách buộc bạn phải khởi tạo nó một cách rõ ràng, câu hỏi trở nên vô nghĩa và đây là một sự khác biệt không tạo ra sự khác biệt nào.
(Ngoài ra, trong trường hợp trên có tối ưu hiệu suất tiềm năng nhỏ, trong đó trình biên dịch có thể sử dụng lại biến mà không phải tạo mã để xóa nội dung của trình biên dịch vì trình biên dịch biết rằng bạn sẽ xóa nội dung .)
Tôi không biết cách trả lời câu hỏi thứ hai của bạn bởi vì tôi không biết ý bạn là "làm việc". Bạn có thể cho tôi biết cách gán "int x = 123;" công trinh? Một khi tôi biết những gì bạn có ý nghĩa của "công trình" sau đó tôi có thể mô tả cách gán một null cho một biến của loại tài liệu tham khảo hoạt động.
Nguồn
2010-01-06 14:53:06
Bạn đang nói về các trường có kiểu tham chiếu và vẫn được khởi tạo là rỗng? Vậy tại sao lại khác biệt như vậy? –
Sự khác biệt giữa những gì? Là địa phương hay không? –
@Mehrdad: Tôi nghĩ anh ấy muốn biết tại sao các biến cục bộ không được tự động khởi tạo về giá trị mặc định của chúng như trái ngược với các trường. Lý do là vì điều này đã được tối ưu hóa. Trình biên dịch có thể nói một biến an toàn có được gán giá trị hay không. Nếu nó không phải là trình biên dịch sẽ ném một lỗi tại thời gian biên dịch. Tối ưu hóa này sẽ không thể cho các trường. –