Hem for döngüsünde hem de for döngüsünün dışında aynı ada sahip bir değişken tanımlamanıza izin verilmemesinin nedeni, dış kapsamdaki değişkenlerin iç kapsamda geçerli olmasıdır. Eğer buna izin verilirse for-loop içinde iki 'i' değişkeni olacaktır.
Bkz: MSDN Kapsamları
özellikle:
Yerel değişken bildirimlerinde bildirilen bir yerel değişkenin kapsamı (Bölüm 8.5.1), bildirimin gerçekleştiği bloktur.
ve
For ifadesinin for-başlatıcısında bildirilen bir yerel değişkenin kapsamı (Bölüm 8.8.3) for for başlatıcısı, for-koşulu, for-yineleyici ve for ifadesinin içerdiği ifadesidir.
Ve ayrıca: Yerel değişken bildirimleri (C # spesifikasyonunun 8.5.1 Bölümü)
özellikle:
Yerel-değişken-bildirimde bildirilen bir yerel değişkenin kapsamı, bildirimin gerçekleştiği bloktur. Yerel değişkenin yerel-değişken-bildiricisinden önce gelen metinsel konumdaki yerel bir değişkene başvurmak bir hatadır. Bir yerel değişken kapsamında, aynı ada sahip başka bir yerel değişken veya sabit bildirmek derleme zamanı hatasıdır.
(Vurgu benim.)
Bu i
, for-loop'unuzun içinin kapsamının for-loop olduğu anlamına gelir . Oysa i
for-loop'unuzun dışının kapsamı tüm ana yöntem artı for-loop'tur. Yani iki kez tekrar edersinizi
, döngü içinde yukarıdakilere göre geçersiz olan .
Yapmanıza izin verilmemesinin int A = i;
nedeni int i
, yalnızca for
döngü içinde kullanım için kapsamlandırılmış olmasıdır . Böylece for
döngü dışında artık erişilemez .
Gördüğünüz gibi her iki konu da kapsamın bir sonucudur; ilk sayı ( int i = 4;
) döngü kapsamı i
içinde iki değişkenle sonuçlanır for
. Oysa int A = i;
kapsam dışı bir değişkene erişim ile sonuçlanır.
Bunun yerine, i
tüm yöntemin kapsamına alınacağının bildirilmesi ve daha sonra hem yöntemde hem de for-döngüsü kapsamında kullanılması bildirilir. Bu, her iki kuralı da ihlal etmekten kaçınacaktır.
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;
}
DÜZENLE :
C # derleyicisi elbette bu kodun oldukça geçerli bir şekilde derlenmesine izin verecek şekilde değiştirilebilir. Sonuçta bu geçerlidir:
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
for (int i = 5; i > 0; i--)
{
Console.WriteLine(i);
}
Ancak, kodun okunabilmesi ve sürdürülebilmesi için aşağıdaki gibi bir kod yazabilmeniz gerçekten yararlı olacaktır:
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);
}
Burada hata olasılığını düşünün, son i
0 veya 4 çıktı mı? Şimdi bu çok küçük bir örnek, takip edilmesi ve izlenmesi oldukça kolay ama dış görünüşü i
farklı bir isimle ilan etmekten kesinlikle daha az bakım yapılabilir ve okunabilir .
NB:
C # 'ın kapsam belirleme kurallarının C ++' ın kapsam belirleme kurallarından farklı olduğunu lütfen unutmayın . C ++ 'da değişkenler sadece bildirildikleri yerden bloğun sonuna kadar kapsamlıdır. Bu da kodunuzu C ++ 'da geçerli bir yapı yapar.