Saya telah menggunakan C # untuk waktu yang cukup lama tetapi tidak pernah menyadari hal berikut:
public static void Main()
{
for (int i = 0; i < 5; i++)
{
}
int i = 4; //cannot declare as 'i' is declared in child scope
int A = i; //cannot assign as 'i' does not exist in this context
}
Jadi mengapa saya tidak bisa menggunakan nilai 'i' di luar blok for jika itu tidak memungkinkan saya untuk mendeklarasikan variabel dengan nama ini?
Saya berpikir bahwa variabel iterator yang digunakan oleh for-loop hanya valid dalam cakupannya.
int i, A; for(int i = 0; i < 5; i++){ } i=4; A=i
Jawaban:
Alasan Anda tidak diizinkan untuk mendefinisikan variabel dengan nama yang sama di kedua for-loop maupun di luar for-loop adalah karena variabel dalam lingkup luar valid dalam lingkup dalam. Berarti akan ada dua variabel 'i' di dalam for-loop jika ini diizinkan.
Lihat: Ruang Lingkup MSDN
Secara khusus:
dan
Dan juga: Deklarasi variabel lokal (Bagian 8.5.1 dari spesifikasi C #)
Secara khusus:
(Penekanan milikku.)
Yang berarti bahwa ruang lingkup di
i
dalam for-loop Anda, adalah untuk-loop. Sedangkan ruang lingkup bagiani
luar for-loop Anda adalah seluruh metode utama plus for-loop. Berarti Anda akan memiliki dua kejadiani
di dalam loop yang tidak valid sesuai dengan di atas.Alasan mengapa Anda tidak diizinkan melakukannya
int A = i;
adalah karenaint i
hanya dicakup untuk digunakan dalamfor
loop. Dengan demikian tidak lagi dapat diakses di luarfor
loop.Seperti yang Anda lihat, kedua masalah ini adalah hasil pelingkupan; masalah pertama (
int i = 4;
) akan menghasilkan duai
variabel dalamfor
lingkup loop. Sedangkanint A = i;
akan menghasilkan akses ke variabel yang berada di luar cakupan.Apa yang bisa Anda lakukan adalah mendeklarasikan
i
untuk mencakup seluruh metode, dan kemudian menggunakannya baik dalam metode maupun lingkup for-loop. Ini akan menghindari melanggar salah satu aturan.EDIT :
Kompiler C # tentu saja dapat diubah untuk memungkinkan kode ini dikompilasi dengan cukup valid. Setelah semua ini valid:
Tetapi apakah itu benar-benar bermanfaat bagi keterbacaan dan pemeliharaan kode Anda untuk dapat menulis kode seperti:
Pikirkan tentang potensi kesalahan di sini, apakah yang terakhir
i
mencetak 0 atau 4? Sekarang ini adalah contoh yang sangat kecil, yang cukup mudah untuk diikuti dan dilacak, tetapi jelas jauh lebih mudah dirawat dan dibaca daripada menyatakan bagian luari
dengan nama yang berbeda.NB:
Harap perhatikan, aturan ruang lingkup C # berbeda dari aturan ruang lingkup C ++ . Dalam C + + variabel hanya dalam ruang lingkup dari mana mereka dideklarasikan sampai akhir blok. Yang akan membuat kode Anda konstruk yang valid di C ++.
sumber
i
variabel dalam ; yang tampaknya lebih jelas bagi saya.i
definisi luar dipindahkan sebelum for loop,i
definisi dalam akan ditandai sebagai tidak valid.Jawaban J.Kommer benar: secara singkat, adalah ilegal untuk variabel lokal dideklarasikan dalam ruang deklarasi variabel lokal yang tumpang tindih dengan ruang deklarasi variabel lokal lain yang memiliki lokal dengan nama yang sama.
Ada aturan tambahan C # yang dilanggar di sini juga. Aturan tambahan adalah bahwa ilegal untuk nama sederhana digunakan untuk merujuk pada dua entitas yang berbeda di dalam dua ruang deklarasi variabel lokal yang tumpang tindih. Jadi bukan saja contoh Anda ilegal, ini juga ilegal:
Karena sekarang nama sederhana "x" telah digunakan di dalam ruang deklarasi variabel lokal "y" berarti dua hal yang berbeda - "this.x" dan lokal "x".
Lihat http://blogs.msdn.com/b/ericlippert/archive/tags/simple+names/ untuk analisis lebih lanjut tentang masalah ini.
sumber
int y = this.x;
this.x
bukan nama yang sederhana .Ada cara mendeklarasikan dan menggunakan
i
di dalam metode setelah loop:Anda dapat melakukan ini di Jawa (mungkin berasal dari C saya tidak yakin). Ini tentu saja agak berantakan demi nama variabel.
sumber
Jika Anda sudah dinyatakan
i
sebelum Andafor
lingkaran, menurut Anda masih harus valid untuk menyatakan itu di dalam loop?Tidak, karena ruang lingkup keduanya akan tumpang tindih.
Sedangkan untuk tidak bisa melakukannya
int A=i;
, yah itu hanya karenai
hanya ada difor
loop, seperti yang seharusnya.sumber
Selain jawaban J.Kommer (+1 btw). Ada ini dalam standar untuk lingkup NET:
Jadi int i decalared dalam for loop header akan berada dalam ruang lingkup hanya selama for loop block, TETAPI itu seumur hidup berlangsung sampai
Main()
kode selesai.sumber
Cara termudah untuk memikirkan hal ini adalah dengan memindahkan deklarasi luar I ke atas loop. Itu harus menjadi jelas kalau begitu.
Bagaimanapun juga cakupannya sama, oleh karena itu tidak dapat dilakukan.
sumber
Juga peraturan C # banyak waktu tidak diperlukan dalam hal memprogram secara ketat, tetapi apakah ada untuk menjaga kode Anda bersih dan mudah dibaca.
misalnya, mereka dapat membuatnya sehingga jika Anda mendefinisikannya setelah loop maka itu ok, namun seseorang yang membaca kode Anda dan melewatkan baris definisi mungkin berpikir itu ada hubungannya dengan variabel loop.
sumber
Jawaban Kommer secara teknis benar. Izinkan saya memprasafkannya dengan metafora layar-buta yang jelas.
Ada layar satu arah yang buta antara blok-untuk dan blok luar yang tertutup sehingga kode dari dalam-blok dapat melihat kode luar tetapi kode di blok luar tidak dapat melihat kode di dalamnya.
Karena kode luar tidak bisa melihat ke dalam, itu tidak bisa menggunakan apa pun yang dinyatakan di dalam. Tetapi karena kode di-blok dapat melihat di dalam dan di luar, variabel yang dideklarasikan di kedua tempat tidak dapat digunakan secara jelas dengan nama.
Jadi Anda tidak melihatnya, atau C #!
sumber
Lihatlah dengan cara yang sama seperti jika Anda dapat mendeklarasikan
int
dalam sebuahusing
blok:Namun, karena
int
tidak diterapkanIDisposable
, ini tidak dapat dilakukan. Ini dapat membantu seseorang memvisualisasikan bagaimana suatuint
variabel ditempatkan dalam ruang lingkup pribadi.Cara lain adalah dengan mengatakan,
Semoga ini bisa membantu memvisualisasikan apa yang sedang terjadi.
Saya sangat suka fitur ini, karena mendeklarasikan
int
dari dalamfor
loop menjaga kode tetap bagus dan kencang.sumber
using
cukup ok, meskipun semantiknya agak berbeda (yang mungkin mengapa itu downvotated). Catat ituif (true)
itu mubazir. Hapus dan Anda memiliki blok pelingkupan.