Lý do bạn không được phép xác định một biến có cùng tên trong cả vòng lặp for cũng như bên ngoài vòng lặp for là vì các biến trong phạm vi bên ngoài là hợp lệ trong phạm vi bên trong. Có nghĩa là sẽ có hai biến 'i' trong vòng lặp for nếu điều này được cho phép.
Xem: Phạm vi MSDN
Đặc biệt:
Phạm vi của một biến cục bộ được khai báo trong khai báo biến cục bộ (Mục 8.5.1) là khối trong đó khai báo xảy ra.
và
Phạm vi của một biến cục bộ được khai báo trong bộ khởi tạo của câu lệnh for (Mục 8.8.3) là bộ khởi tạo, điều kiện for, bộ lặp for và câu lệnh chứa của câu lệnh for.
Và cũng: Khai báo biến cục bộ (Mục 8.5.1 của đặc tả C #)
Đặc biệt:
Phạm vi của một biến cục bộ được khai báo trong một khai báo biến cục bộ là khối trong đó khai báo xảy ra. Đó là một lỗi khi đề cập đến một biến cục bộ ở vị trí văn bản có trước khai báo biến cục bộ của biến cục bộ. Trong phạm vi của một biến cục bộ, đó là lỗi thời gian biên dịch để khai báo một biến cục bộ hoặc hằng số khác có cùng tên.
(Nhấn mạnh của tôi.)
Điều đó có nghĩa là phạm vi của i
vòng lặp for của bạn, là vòng lặp for. Trong khi đó phạm vi i
bên ngoài vòng lặp for của bạn là toàn bộ phương thức chính cộng với vòng lặp for. Có nghĩa là bạn có hai lần xuất hiện i
bên trong vòng lặp không hợp lệ theo quy định trên.
Lý do tại sao bạn không được phép làm int A = i;
là vì int i
chỉ có phạm vi sử dụng trong for
vòng lặp. Do đó, nó không còn có thể truy cập bên ngoài for
vòng lặp.
Như bạn có thể thấy cả hai vấn đề này là kết quả của phạm vi; vấn đề đầu tiên ( int i = 4;
) sẽ dẫn đến hai i
biến trong for
phạm vi vòng lặp. Trong khi đó int A = i;
sẽ dẫn đến quyền truy cập vào một biến nằm ngoài phạm vi.
Thay vào đó, những gì bạn có thể làm là tuyên bố i
sẽ nằm trong phạm vi của toàn bộ phương thức và sau đó sử dụng nó trong cả phương thức cũng như phạm vi vòng lặp for. Điều này sẽ tránh phá vỡ một trong hai quy tắc.
public static void Main()
{
int i;
for (i = 0; i < 5; i++)
{
}
// 'i' is only declared in the method scope now,
// no longer in the child scope -> valid.
i = 4;
// 'i' is declared in the method's scope -> valid.
int A = i;
}
CHỈNH SỬA :
Trình biên dịch C # tất nhiên có thể được thay đổi để cho phép mã này biên dịch khá hợp lệ. Sau khi tất cả điều này là hợp lệ:
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
for (int i = 5; i > 0; i--)
{
Console.WriteLine(i);
}
Nhưng nó có thực sự có lợi cho khả năng đọc và bảo trì mã của bạn để có thể viết mã như:
public static void Main()
{
int i = 4;
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
for (int i = 5; i > 0; i--)
{
Console.WriteLine(i);
}
Console.WriteLine(i);
}
Hãy suy nghĩ về khả năng sai lầm ở đây, i
bản in cuối cùng ra 0 hay 4? Bây giờ đây là một ví dụ rất nhỏ, một ví dụ khá dễ theo dõi và theo dõi nhưng nó chắc chắn ít được bảo trì và dễ đọc hơn nhiều so với việc khai báo bên ngoài i
bằng một tên khác.
Lưu ý:
Xin lưu ý, quy tắc phạm vi của C # khác với quy tắc phạm vi của C ++ . Trong C ++, các biến chỉ trong phạm vi từ nơi chúng được khai báo cho đến khi kết thúc khối. Điều này sẽ làm cho mã của bạn trở thành một cấu trúc hợp lệ trong C ++.