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 ifor-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 fordöngü içinde kullanım için kapsamlandırılmış olmasıdır . Böylece fordö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ı iiç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, itü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 i0 veya 4 çıktı mı? Şimdi bu çok küçük bir örnek, takip edilmesi ve izlenmesi oldukça kolay ama dış görünüşü ifarklı 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.