Có hai quy tắc có liên quan ở đây.
Nguyên tắc liên quan đầu tiên là:
Đây là một lỗi cho một không gian khai báo biến địa phương và một địa phương gian khai báo biến lồng nhau để chứa yếu tố có cùng tên.
(Và một câu trả lời trên trang này gọi ra vị trí khác trong đặc điểm kỹ thuật mà chúng ta gọi này ra một lần nữa.)
Điều đó một mình là đủ để làm cho điều này bất hợp pháp, nhưng trong thực tế, một quy tắc thứ hai làm bất hợp pháp này .
Nguyên tắc liên quan thứ hai trong C# là:
Đối với mỗi lần xuất hiện của một trao nhận dạng làm đơn giản tên tuổi trong một biểu thức hoặc declarator, trong khối địa phương không gian khai báo biến, ngay lập tức kèm theo hoặc khối chuyển đổi của sự xuất hiện đó, mọi lần xuất hiện khác cùng số số nhận dạng dưới dạng tên đơn giản trong biểu thức hoặc khai báo trong ngay lập tức kèm theo khối hoặc chuyển đổi- khối phải tham chiếu đến cùng một thực thể . Quy tắc này đảm bảo rằng ý nghĩa của một tên luôn giống nhau trong một khối nhất định, khối chuyển đổi, cho-, foreach- hoặc sử dụng-tuyên bố, hoặc chức năng ẩn danh.
Bạn cũng cần phải biết rằng vòng lặp for được xử lý như thể có "niềng răng vô hình" xung quanh toàn bộ.
Bây giờ chúng ta biết rằng, chúng ta hãy chú thích mã của bạn:
public void MyMethod()
{ // 1
int i=10; // i1
{ // 2 -- invisible brace
for(int x=10; x<10; x++) // x2
{ // 3
int i=10; // i3
var objX = new MyOtherClass(); // objX3
} // 3
} // 2
var objX = new OtherClasOfMine(); // objX1
} // 1
Bạn có ba "tên đơn giản", i, x và objX. Bạn có năm biến, mà tôi đã gắn nhãn i1, x2, i3, objX3 và objX1.
Khối ngoài cùng có chứa tập quán của i và objX là khối 1. Do đó, trong khối 1, i và objX phải luôn luôn tham chiếu đến cùng một điều. Nhưng họ thì không. Đôi khi tôi đề cập đến i1 và đôi khi nó đề cập đến i3. Tương tự với objX.
x, tuy nhiên, chỉ bao giờ có nghĩa là x2, trong mỗi khối.
Ngoài ra, cả hai biến "i" đều nằm trong không gian khai báo biến cục bộ giống như cả hai biến "objX".
Do đó, chương trình này là lỗi theo nhiều cách.
Trong chương trình thứ hai của bạn:
public void MyMethod()
{ // 1
{ // 2 -- invisible
for(int x=10; x<10; x++) // x2
{ // 3
int i=10; // i3
var objX = new MyOtherClass(); // objX3
} //3
} // 2
{ // 4 -- invisible
for(int x=10; x<10; x++) // x4
{ // 5
int i=10; // i5
var objX = new MyOtherClass(); // objX5
} //5
} // 4
} // 1
Bây giờ bạn có ba tên đơn giản một lần nữa, và sáu biến.
Các khối ngoài cùng đầu tiên chứa việc sử dụng tên đơn giản x là các khối 2 và 4. Trong khối 2, x đề cập đến x2. Trong suốt khối 4, x là x4. Do đó, điều này là hợp pháp. Tương tự với i và objX - chúng được sử dụng trong các khối 3 và 5 và có nghĩa là những thứ khác nhau trong mỗi khối. Nhưng không nơi nào là cùng một tên đơn giản được sử dụng để có nghĩa là hai điều khác nhau trong suốt cùng một khối.
Bây giờ, bạn có thể lưu ý rằng xem xét tất cả các khối 1, x được sử dụng để có nghĩa là cả x2 và x4. Nhưng không có đề cập đến x đó là bên trong khối 1 nhưng cũng không bên trong khối khác. Do đó, chúng tôi không tính việc sử dụng không nhất quán trong khối 1 là có liên quan.
Ngoài ra, không có khoảng trống khai báo trùng lặp theo cách bất hợp pháp.
Vì vậy, điều này là hợp pháp.
Cảm ơn rất mô tả. –
Nó rất dễ dàng để nhớ nó như là một quy tắc ... nhưng một số như thế nào im không thể tiêu hóa tại sao đó là giới hạn, wrt mã đầu tiên và objX: tôi tạo ra một biến trong một khối và khi tôi đi ra khỏi một vòng nó shud được hoàn thành , giống như tôi không thể truy cập nó bên ngoài khối. –
Nhìn vào nó theo cách này. Nó luôn luôn là hợp pháp để di chuyển tuyên bố của một biến UP trong mã nguồn miễn là bạn giữ nó trong cùng một khối, phải không? Nếu chúng tôi đã làm nó theo cách bạn đề nghị, thì đôi khi điều đó sẽ hợp pháp và đôi khi là bất hợp pháp! Nhưng điều chúng tôi thực sự muốn tránh là những gì xảy ra trong C++ - trong C++, đôi khi di chuyển một tuyên bố biến lên thực sự thay đổi các ràng buộc của các tên đơn giản khác! –