Mengapa C # memungkinkan blok kode tanpa pernyataan sebelumnya (misalnya if
, else
, for
, while
)?
void Main()
{
{ // any sense in this?
Console.Write("foo");
}
}
Mengapa C # memungkinkan blok kode tanpa pernyataan sebelumnya (misalnya if
, else
, for
, while
)?
void Main()
{
{ // any sense in this?
Console.Write("foo");
}
}
Jawaban:
Dalam konteks yang Anda berikan, tidak ada artinya. Menulis string konstan ke konsol akan bekerja dengan cara yang sama di manapun dalam aliran program. 1
Sebaliknya, Anda biasanya menggunakannya untuk membatasi cakupan beberapa variabel lokal. Ini dijelaskan lebih lanjut di sini dan di sini . Lihatlah jawaban João Angelo dan jawaban Chris Wallis untuk contoh singkat. Saya percaya hal yang sama berlaku untuk beberapa bahasa lain dengan sintaks gaya-C juga, meskipun mereka tidak relevan dengan pertanyaan ini.
1 Kecuali, tentu saja, Anda memutuskan untuk mencoba menjadi lucu dan membuat Console
kelas Anda sendiri , dengan Write()
metode yang melakukan sesuatu yang sama sekali tidak terduga.
out
parameter ke implementasi antarmuka tertulis dalam bahasa lain, dan implementasi itu membaca variabel sebelum menulisnya.
Itu { ... }
memiliki setidaknya efek samping memperkenalkan lingkup baru untuk variabel lokal.
Saya cenderung menggunakannya dalam switch
pernyataan untuk memberikan ruang lingkup yang berbeda untuk setiap kasus dan dengan cara ini memungkinkan saya untuk mendefinisikan variabel lokal dengan nama yang sama di lokasi terdekat yang memungkinkan penggunaannya dan juga menunjukkan bahwa mereka hanya valid pada tingkat kasus.
{}
untuk tetap mendapatkan lencana emas itu ... :)
Ini bukan merupakan fitur C # tetapi merupakan efek samping logis dari banyak bahasa sintaks C yang menggunakan tanda kurung kurawal untuk menentukan cakupan .
Dalam contoh Anda, tanda kurung kurawal tidak berpengaruh sama sekali, tetapi dalam kode berikut mereka menentukan cakupan, dan karenanya, visibilitas, variabel:
Ini diperbolehkan karena saya keluar dari ruang lingkup di blok pertama dan didefinisikan lagi di blok berikutnya:
{
{
int i = 0;
}
{
int i = 0;
}
}
Ini tidak diperbolehkan karena saya telah keluar dari ruang lingkup dan tidak lagi terlihat di ruang lingkup luar:
{
{
int i = 0;
}
i = 1;
}
Dan seterusnya dan seterusnya.
{}
dikenal sebagai tanda kurung?
One of two marks of the form [ ] or ( ), and in mathematical use also {}, used for enclosing a word or number of words, a portion of a mathematical formula, or the like, so as to separate it from the context;
Dalam hal apa pun itu bukan tanda kurung, tetapi 'kurung kurawal' tampaknya OK.
Saya anggap {}
sebagai pernyataan yang bisa memuat beberapa pernyataan.
Pertimbangkan pernyataan if yang ada di luar ekspresi boolean diikuti dengan satu pernyataan. Ini akan berhasil:
if (true) Console.Write("FooBar");
Ini akan berhasil juga:
if (true)
{
Console.Write("Foo");
Console.Write("Bar");
}
Jika saya tidak salah ini disebut pernyataan blok.
Karena {}
dapat berisi pernyataan lain, ia juga dapat berisi lainnya {}
. Ruang lingkup variabel ditentukan oleh induknya {}
(pernyataan blok).
Poin yang saya coba buat adalah itu {}
hanya pernyataan, jadi tidak memerlukan jika atau apa pun ...
Aturan umum dalam bahasa sintaks C adalah "apa pun di antara keduanya { }
harus diperlakukan sebagai pernyataan tunggal, dan dapat digunakan di mana pun satu pernyataan bisa":
if
.for
, while
atau do
.Untuk semua maksud dan tujuan, karena tata bahasa termasuk ini:
<statement> :== <definition of valid statement> | "{" <statement-list> "}"
<statement-list> :== <statement> | <statement-list> <statement>
Artinya, "pernyataan dapat terdiri dari (berbagai hal) atau kurung kurawal buka, diikuti oleh daftar pernyataan (yang dapat mencakup satu atau lebih pernyataan), diikuti oleh tanda kurung kurawal". IE "sebuah { }
blok dapat menggantikan pernyataan apa pun, di mana saja". Termasuk di tengah kode.
Tidak mengizinkan { }
blok di mana pun sebuah pernyataan bisa pergi sebenarnya akan membuat definisi bahasa lebih kompleks .
Karena C ++ (dan java) mengizinkan blok kode tanpa pernyataan sebelumnya.
C ++ mengizinkan mereka karena C melakukannya.
Bisa dibilang semuanya bermuara pada fakta bahwa desain bahasa program AS (berbasis C) menang daripada desain bahasa program Eropa ( berbasis Modula-2 ).
(Pernyataan kontrol bertindak atas satu pernyataan, pernyataan dapat menjadi kelompok untuk membuat pernyataan baru)
// if (a == b)
// if (a != b)
{
// do something
}
Anda bertanya "mengapa" C # mengizinkan blok kode tanpa pernyataan sebelumnya. Pertanyaan "mengapa" juga dapat diartikan sebagai "apa manfaat yang mungkin didapat dari konstruksi ini?"
Secara pribadi, saya menggunakan blok kode tanpa pernyataan di C # di mana keterbacaan sangat ditingkatkan untuk pengembang lain, sambil mengingat bahwa blok kode membatasi ruang lingkup variabel lokal. Misalnya, pertimbangkan cuplikan kode berikut, yang jauh lebih mudah dibaca berkat blok kode tambahan:
OrgUnit world = new OrgUnit() { Name = "World" };
{
OrgUnit europe = new OrgUnit() { Name = "Europe" };
world.SubUnits.Add(europe);
{
OrgUnit germany = new OrgUnit() { Name = "Germany" };
europe.SubUnits.Add(germany);
//...etc.
}
}
//...commit structure to DB here
Saya sadar bahwa ini dapat diselesaikan dengan lebih elegan dengan menggunakan metode untuk setiap tingkat struktur. Tapi sekali lagi, perlu diingat bahwa hal-hal seperti data sampel seeder biasanya harus cepat.
Jadi meskipun kode di atas dijalankan secara linier, struktur kode tersebut merepresentasikan struktur "dunia nyata" dari objek, sehingga memudahkan pengembang lain untuk memahami, memelihara, dan memperluas.