2010-01-13 28 views
14

Tôi đã tự hỏi tại sao trong C# sử dụng tên biến được sử dụng trước đây trong phạm vi con không được phép. Như thế này:Sử dụng tên biến được sử dụng trong phạm vi con

if (true) 
{ 
    int i = 1; 
} 

int i = 2; 

Biên dịch mã trên tạo ra một lỗi:

A local variable named 'i' cannot be declared in this scope because it would give a different meaning to 'i', which is already used in a 'child' scope to denote something else

Tuy nhiên bạn không thể sử dụng các biến được định nghĩa trong phạm vi con một trong hai. Đoạn mã trên hoạt động tốt trong Java và tôi không thể thấy lý do tại sao nó không có trong C#. Tôi chắc chắn có một lý do chính đáng, nhưng nó là gì?

Trả lời

14

Đây là một sự lựa chọn thiết kế được thực hiện bởi các nhà thiết kế của C#. Nó làm giảm sự mơ hồ tiềm năng.

Bạn có thể sử dụng nó ở một trong hai nơi, bên trong if hoặc bên ngoài, nhưng bạn chỉ có thể xác định nó ở một nơi. Nếu không, bạn nhận được một lỗi trình biên dịch, như bạn đã tìm thấy.

+0

Tôi thực sự nghĩ rằng sẽ có một lý do "thực sự", bởi vì tôi thực sự không thể hiểu tại sao mọi người lại chọn lựa như thế. : D Nhưng tôi thấy quan điểm và thật tuyệt khi biết tại sao. – Carlos

+0

khilon: Tôi thực sự nghĩ lý do thực sự là lý do tôi đề xuất; ^) – Toad

+1

@Carlos fyi, lý do _real_ là tất cả các khai báo biến được chuyển lên đầu phạm vi của chúng tại một thời điểm nào đó (biên dịch hoặc JIT). Do đó, thứ tự các phạm vi của bạn liên quan đến các khai báo của bạn rất ít, xung đột phạm vi con/tổ tiên sẽ luôn là xung đột trong thời gian chạy. Trình biên dịch từ chối nó trước. – Gusdor

0

cho tất cả các xác suất, bất kỳ biến nào được tạo trong bất kỳ phạm vi con nào, sẽ được đặt trên khung xếp chồng khi phương thức được nhập.

Bằng cách này, tên tương tự trong phạm vi con không thể cùng tồn tại với tên biến trong phạm vi con khác.

Họ có thể đã làm việc xung quanh này tất nhiên nếu họ muốn, vì vậy tôi đoán nó cuối cùng đã làm với thiết kế cũng .. Bằng cách này có ít cơ hội cho lỗi

1

Như Adam Crossland nói, đó là một thiết kế lựa chọn - Được thực hiện để đảm bảo bạn (hoặc nhiều khả năng, các nhà phát triển đồng nghiệp của bạn) không hiểu sai mã.

Bạn thường thấy các thành viên dụ tin bắt đầu bằng một "m_" hoặc "_" (ví dụ. _myVar hoặc m_myVar) để tránh nhầm lẫn ..

3

Something Tôi nhận thấy rằng đã không được ghi nhận ở đây. này sẽ biên dịch:

for (int i = 0; i < 10; i++) 
{ 
    int a = i * 2; 
} 
for (int i = 0; i < 5; i++) 
{ 
    int b = i * 2; 
} 

Nhìn chung, các quyết định thiết kế dường như không phù hợp, hoặc ít nhất là kỳ quặc hạn chế và dễ dãi, tương ứng.

+0

"Tại sao tôi có thể sử dụng cùng một biến trong phạm vi anh chị em kéo" nên là bình luận hoặc câu hỏi khác. Không thực sự là một câu trả lời như bài này nói về phạm vi anh chị em, không giống như câu hỏi ban đầu (phạm vi con/cha mẹ). –

+0

Tôi đồng ý. Tôi đã cố gắng để tăng kiến ​​thức bằng cách chỉ ra một cái gì đó kỳ lạ về C# phạm vi liên quan đến câu hỏi ban đầu, nhưng tiếc là tôi không thể gửi nó như một bình luận kể từ khi đại diện của tôi là quá thấp. – jeffmk

+0

Tôi thực sự không thể nhìn thấy bất cứ điều gì sai, những gì là sai với nó biên dịch? –

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