Banyak kasus dalam pernyataan beralih

582

Apakah ada cara untuk melewati beberapa pernyataan kasus tanpa menyatakan case value:berulang kali?

Saya tahu ini bekerja:

switch (value)
{
   case 1:
   case 2:
   case 3:
      // Do some stuff
      break;
   case 4:
   case 5:
   case 6:
      // Do some different stuff
      break;
   default:
       // Default stuff
      break;
}

tapi saya ingin melakukan sesuatu seperti ini:

switch (value)
{
   case 1,2,3:
      // Do something
      break;
   case 4,5,6:
      // Do something
      break;
   default:
      // Do the Default
      break;
}

Apakah sintaks ini yang saya pikirkan dari bahasa yang berbeda, atau saya kehilangan sesuatu?

theo
sumber
Apakah ada alasan Anda tidak hanya menggunakan pernyataan IF (jika Anda memeriksa berbagai int)?
Eric Schoonover
2
ya charlse, cara pertama berfungsi dengan baik, saya sudah menggunakannya di banyak tempat. Ini lebih kotor daripada yang saya inginkan, tetapi ini berguna. Saya hanya menggunakan bilangan bulat itu sebagai contoh. Data nyata lebih bervariasi. An if (1 || 2 || 3) {...} selain itu jika (4 || 5 || 6) {...} akan bekerja juga, tetapi lebih sulit untuk dibaca.
theo
5
mengapa Anda menganggap yang terakhir lebih kotor daripada yang pertama. Yang terakhir menambahkan arti lain ,dan yang tidak dibagi dengan bahasa c-style lainnya. Bagi saya itu tampak lebih kotor.
Jon Hanna
1
Anda mungkin telah mengambil sintaks ke-2 dari Ruby. Begitulah cara kerjanya dalam bahasa itu (meskipun beralih menjadi kasus, dan kasus menjadi ketika, antara lain.)
juanpaco
4
Catatan Penting . Kisaran didukung dalam kasus sakelar mulai C # v7 - Silakan lihat jawaban
RBT

Jawaban:

313

Tidak ada sintaks dalam C ++ atau C # untuk metode kedua yang Anda sebutkan.

Tidak ada yang salah dengan metode pertama Anda. Namun jika Anda memiliki rentang yang sangat besar, gunakan saja serangkaian pernyataan if.

Brian R. Bondy
sumber
5
Sebagai tambahan, saya ingin menambahkan tautan ke spesifikasi bahasa C # yang tersedia di MSDN di msdn.microsoft.com/en-us/vcsharp/aa336809.aspx
Richard McGuire
Pengguna dapat menggunakan beberapa if (atau pencarian tabel) untuk mengurangi input ke set enum dan mengaktifkan enum.
Harvey
5
mungkin memilih itu dari VB.net
George Birbilis
1
VB.net lebih baik untuk berbagai pernyataan kasus ... kecuali mereka tidak lolos seperti C #. Ambil sedikit, beri sedikit.
Brain2000
Saya percaya ini tidak benar lagi. Lihat stackoverflow.com/questions/20147879/… . Juga pada pertanyaan ini juga ada jawaban stackoverflow.com/a/44848705/1073157
Dan Rayson
700

Saya kira ini sudah dijawab. Namun, saya pikir Anda masih dapat mencampur kedua opsi dengan cara yang lebih baik secara sintaksis dengan melakukan:

switch (value)
{
    case 1: case 2: case 3:          
        // Do Something
        break;
    case 4: case 5: case 6: 
        // Do Something
        break;
    default:
        // Do Something
        break;
}
Carlos Quintanilla
sumber
3
'switch' harus huruf kecil untuk c #?
Austin Harris
3
Kode yang diciutkan diperpanjang menjadi contoh pertama dalam pertanyaan. Semoga lakukan saja seperti dalam pertanyaan.
MetalPhoenix
10
Kenapa mengganggu? Indentor otomatis di Visual Studio 2013 akan mengembalikan ini ke format dalam pertanyaan awal.
Gustav
14
@T_D mendapat dukungan karena sebenarnya menjawab pertanyaan. OP berkata, apa aku kehilangan sesuatu ... Carlos menjawab dengan apa yang hilang. Sepertinya cukup dipotong dan dikeringkan bagiku. Jangan benci dia mendapat 422 upvotes.
Mike Devenney
8
@ MikeDevenney Kemudian Anda menafsirkan pertanyaan secara berbeda, sejauh yang saya lihat jawaban yang benar adalah "tidak, c # tidak memiliki sintaks untuk itu". Jika seseorang bertanya "apakah mungkin untuk menuangkan cairan ke dalam gelas yang saya pegang terbalik?" jawabannya harus "tidak" dan bukan "Anda dapat menuangkan cairan jika Anda melihatnya terbalik dan menggunakan imajinasi Anda", karena jawaban ini adalah semua tentang menggunakan imajinasi. Jika Anda menggunakan sintaks biasa tetapi memformatnya dengan buruk sepertinya sintaksis lain, dengan beberapa imajinasi. Semoga Anda mengerti maksud saya ...: P
T_D
74

Sintaks ini dari Visual Basic Select ... Pernyataan Kasus :

Dim number As Integer = 8
Select Case number
    Case 1 To 5
        Debug.WriteLine("Between 1 and 5, inclusive")
        ' The following is the only Case clause that evaluates to True.
    Case 6, 7, 8
        Debug.WriteLine("Between 6 and 8, inclusive")
    Case Is < 1
        Debug.WriteLine("Equal to 9 or 10")
    Case Else
        Debug.WriteLine("Not between 1 and 10, inclusive")
End Select

Anda tidak dapat menggunakan sintaks ini dalam C #. Sebagai gantinya, Anda harus menggunakan sintaks dari contoh pertama Anda.

Neal
sumber
49
ini adalah salah satu dari sedikit hal yang saya lewatkan tentang * Dasar.
nickf
10
Di sini kita memiliki satu dari beberapa tampilan di mana visual basic tidak jelek, dan lebih fleksibel daripada c #. Ini adalah contoh berharga!
bgmCoder
Ini lumayan. Saya ingin tahu mengapa ini belum ditambahkan dengan C # 8.0. Akan sangat bagus.
Sigex
69

Dalam C # 7 (tersedia secara default di Visual Studio 2017 / .NET Framework 4.6.2), beralih berbasis jangkauan sekarang mungkin dengan pernyataan switch dan akan membantu dengan masalah OP.

Contoh:

int i = 5;

switch (i)
{
    case int n when (n >= 7):
        Console.WriteLine($"I am 7 or above: {n}");
        break;

    case int n when (n >= 4 && n <= 6 ):
        Console.WriteLine($"I am between 4 and 6: {n}");
        break;

    case int n when (n <= 3):
        Console.WriteLine($"I am 3 or less: {n}");
        break;
}

// Output: I am between 4 and 6: 5

Catatan:

  • Tanda kurung (dan )tidak diperlukan dalam whenkondisi, tetapi digunakan dalam contoh ini untuk menyoroti perbandingan.
  • varjuga dapat digunakan sebagai pengganti int. Sebagai contoh: case var n when n >= 7:.
Steve Gomez
sumber
3
Ini (pencocokan pola) umumnya harus menjadi praktik terbaik ketika Anda dapat menggunakan C # 7.x atau lebih, karena jauh lebih jelas daripada jawaban lainnya.
UndyingJellyfish
Apakah ada cara untuk mencapai ini dengan daftar Enums? Di mana peta Enums di int?
Sigex
33

Anda dapat meninggalkan baris baru yang memberi Anda:

case 1: case 2: case 3:
   break;

tapi saya menganggap gaya buruk itu.

Allan Wind
sumber
20

.NET Framework 3.5 memiliki rentang:

Enumerable.Range dari MSDN

Anda dapat menggunakannya dengan "berisi" dan pernyataan IF, karena seperti seseorang mengatakan pernyataan SWITCH menggunakan operator "==".

Berikut sebuah contoh:

int c = 2;
if(Enumerable.Range(0,10).Contains(c))
    DoThing();
else if(Enumerable.Range(11,20).Contains(c))
    DoAnotherThing();

Tapi saya pikir kita bisa bersenang-senang lagi: karena Anda tidak akan memerlukan nilai kembali dan tindakan ini tidak mengambil parameter, Anda dapat dengan mudah menggunakan tindakan!

public static void MySwitchWithEnumerable(int switchcase, int startNumber, int endNumber, Action action)
{
    if(Enumerable.Range(startNumber, endNumber).Contains(switchcase))
        action();
}

Contoh lama dengan metode baru ini:

MySwitchWithEnumerable(c, 0, 10, DoThing);
MySwitchWithEnumerable(c, 10, 20, DoAnotherThing);

Karena Anda melewati tindakan, bukan nilai, Anda harus menghilangkan tanda kurung, itu sangat penting. Jika Anda membutuhkan fungsi dengan argumen, cukup ubah jenis Actionke Action<ParameterType>. Jika Anda perlu mengembalikan nilai, gunakanFunc<ParameterType, ReturnType> .

Dalam C # 3.0 tidak ada Aplikasi Partial yang mudah untuk merangkum fakta parameter kasusnya sama, tetapi Anda membuat metode pembantu kecil (sedikit verbose, tho).

public static void MySwitchWithEnumerable(int startNumber, int endNumber, Action action){ 
    MySwitchWithEnumerable(3, startNumber, endNumber, action); 
}

Berikut ini contoh bagaimana pernyataan fungsional baru yang diimpor adalah IMHO lebih kuat dan elegan daripada yang imperatif lama.

Luca Molteni
sumber
3
Pilihan bagus. Satu hal yang perlu diperhatikan, - Enumerable.Range memiliki argumen int startdan int count. Contoh-contoh Anda tidak akan berfungsi sebagaimana mestinya. Anda menulisnya seolah argumen kedua adalah int end. Misalnya - Enumerable.Range(11,20)akan menghasilkan 20 angka yang dimulai dengan 11, dan bukan angka dari 11 hingga 20.
Gabriel McAdams
meskipun, jika bekerja dengan Enum, mengapa tidak seperti itu? if (Enumerable.Range (MyEnum.A, MyEnum.M) {DoThing ();} lain jika (Enumerable.Range (MyEnum.N, MyEnum.Z) {DoAnotherThing ();}
David Hollowell - MSFT
4
Catatan yang Enumerable.Range(11,20).Contains(c)setara dengan for(int i = 11; i < 21; ++i){ if (i == c) return true; } return false;Jika Anda memiliki jangkauan besar, itu akan memakan waktu lama, sementara hanya menggunakan >dan <akan cepat dan waktu yang konstan.
Jon Hanna
Suatu peningkatan: Memiliki MySwitchWithEnumerablepengembalian voidadalah desain yang lemah untuk situasi ini. ALASAN: Anda telah mengonversikan if-elseserangkaian pernyataan independen - yang menyembunyikan maksudnya, yaitu bahwa keduanya saling eksklusif - hanya satu actionyang dieksekusi. Sebaliknya kembali bool, dengan tubuh if (..) { action(); return true; } else return false;Situs memanggil kemudian menunjukkan niat: if (MySwitchWithEnumerable(..)) else (MySwitchWithEnumerable(..));. Ini lebih disukai. Namun, ini juga bukan lagi peningkatan yang signifikan dibandingkan versi asli Anda, untuk kasus sederhana ini.
ToolmakerSteve
15

Inilah solusi lengkap C # 7 ...

switch (value)
{
   case var s when new[] { 1,2,3 }.Contains(s):
      // Do something
      break;
   case var s when new[] { 4,5,6 }.Contains(s):
      // Do something
      break;
   default:
      // Do the default
      break;
}

Ia bekerja dengan string juga ...

switch (mystring)
{
   case var s when new[] { "Alpha","Beta","Gamma" }.Contains(s):
      // Do something
      break;
...
}
Carter Medlin
sumber
Ini berarti bahwa Anda mengalokasikan array dengan setiap pernyataan switch, bukan? Bukankah lebih baik jika kita menjadikannya sebagai variabel konstan?
MaLiN2223
Elegan, tetapi memang akan baik untuk mengetahui apakah kompiler mengoptimalkan skenario ini sehingga permintaan berulang tidak membuat overhead konstruksi array setiap waktu; mendefinisikan array sebelumnya adalah pilihan, tetapi menghilangkan banyak keanggunan.
mklement0
11

Kode di bawah ini tidak berfungsi:

case 1 | 3 | 5:
// Not working do something

Satu-satunya cara untuk melakukan ini adalah:

case 1: case 2: case 3:
// Do something
break;

Kode yang Anda cari berfungsi di Visual Basic di mana Anda dapat dengan mudah memasukkan rentang ... dalam noneopsi switchpernyataan atauif else blok yang nyaman, saya sarankan, pada titik yang sangat ekstrim, buat .dll dengan Visual Basic dan impor kembali ke proyek C # Anda.

Catatan: setara saklar di Visual Basic adalah Select Case.

tidak ada
sumber
7

Pilihan lain adalah menggunakan rutinitas. Jika case 1-3 semuanya menjalankan logika yang sama maka bungkus logika itu dalam suatu rutin dan panggil untuk setiap case. Saya tahu ini tidak benar-benar menghilangkan pernyataan kasus, tetapi menerapkan gaya yang baik dan menjaga pemeliharaan tetap minimum .....

[Sunting] Menambahkan implementasi alternatif untuk mencocokkan pertanyaan asli ... [/ Edit]

switch (x)
{
   case 1:
      DoSomething();
      break;
   case 2:
      DoSomething();
      break;
   case 3:
      DoSomething();
      break;
   ...
}

private void DoSomething()
{
   ...
}

Alt

switch (x)
{
   case 1:
   case 2:
   case 3:
      DoSomething();
      break;
   ...
}

private void DoSomething()
{
   ...
}
Dr8k
sumber
5

Satu sisi yang kurang dikenal dari saklar di C # adalah bahwa ia bergantung pada operator = dan karena itu dapat diganti Anda bisa memiliki sesuatu seperti ini:


string s = foo();

switch (s) {
  case "abc": /*...*/ break;
  case "def": /*...*/ break;
}
Cyber ​​Oliveira
sumber
4
ini bisa menjadi masalah besar nantinya bagi orang lain yang mencoba membaca kode
Andrew Harry
5

gcc mengimplementasikan ekstensi ke bahasa C untuk mendukung rentang berurutan:

switch (value)
{
   case 1...3:
      //Do Something
      break;
   case 4...6:
      //Do Something
      break;
   default:
      //Do the Default
      break;
}

Sunting : Hanya memperhatikan tag C # pada pertanyaan, jadi mungkin jawaban gcc tidak membantu.

DGentry
sumber
4

Di C # 7 kami sekarang memiliki Pencocokan Pola sehingga Anda dapat melakukan sesuatu seperti:

switch (age)
{
  case 50:
    ageBlock = "the big five-oh";
    break;
  case var testAge when (new List<int>()
      { 80, 81, 82, 83, 84, 85, 86, 87, 88, 89 }).Contains(testAge):
    ageBlock = "octogenarian";
    break;
  case var testAge when ((testAge >= 90) & (testAge <= 99)):
    ageBlock = "nonagenarian";
    break;
  case var testAge when (testAge >= 100):
    ageBlock = "centenarian";
    break;
  default:
    ageBlock = "just old";
    break;
}
Luke T O'Brien
sumber
3

Sebenarnya saya tidak suka perintah GOTO juga, tetapi ini dalam materi Microsoft resmi, dan di sini semua sintaks diizinkan.

Jika titik akhir daftar pernyataan bagian switch dapat dijangkau, kesalahan waktu kompilasi terjadi. Ini dikenal sebagai aturan "no fall through". Contoh

switch (i) {
case 0:
   CaseZero();
   break;
case 1:
   CaseOne();
   break;
default:
   CaseOthers();
   break;
}

valid karena tidak ada bagian sakelar yang memiliki titik akhir yang dapat dijangkau. Tidak seperti C dan C ++, eksekusi bagian switch tidak diizinkan untuk "jatuh" ke bagian switch berikutnya, dan contohnya

switch (i) {
case 0:
   CaseZero();
case 1:
   CaseZeroOrOne();
default:
   CaseAny();
}

menghasilkan kesalahan waktu kompilasi. Ketika eksekusi bagian switch harus diikuti dengan eksekusi bagian switch lain, kasus goto eksplisit atau pernyataan default goto harus digunakan:

switch (i) {
case 0:
   CaseZero();
   goto case 1;
case 1:
   CaseZeroOrOne();
   goto default;
default:
   CaseAny();
   break;
}

Beberapa label diizinkan di bagian sakelar. Contoh

switch (i) {
case 0:
   CaseZero();
   break;
case 1:
   CaseOne();
   break;
case 2:
default:
   CaseTwo();
   break;
}

Saya percaya pada kasus khusus ini, GOTO dapat digunakan, dan itu sebenarnya satu-satunya cara untuk jatuh.

Sumber: http://msdn.microsoft.com/en-us/library/aa664749%28v=vs.71%29.aspx

Jiří Herník
sumber
Perhatikan bahwa dalam praktiknya, gotohampir selalu dapat dihindari (meskipun saya tidak menganggapnya "mengerikan" di sini - itu mengisi peran khusus, terstruktur,). Dalam contoh Anda, karena Anda telah membungkus tubuh case dalam fungsi (hal yang baik), case 0 dapat menjadi CaseZero(); CaseZeroOrOne(); break;. Tidak gotodiperlukan
ToolmakerSteve
Tautan setengah rusak (pengalihan, "Visual Studio 2003 Dokumentasi Teknis Pensiunan" ).
Peter Mortensen
2

Banyak sekali pekerjaan tampaknya telah dimasukkan ke dalam mencari cara untuk mendapatkan salah satu sintaks C # paling tidak digunakan untuk entah bagaimana terlihat lebih baik atau bekerja lebih baik. Secara pribadi saya menemukan pernyataan beralih jarang layak digunakan. Saya sangat menyarankan untuk menganalisis data apa yang Anda uji dan hasil akhir yang Anda inginkan.

Misalnya, Anda ingin menguji nilai dengan cepat dalam rentang yang diketahui untuk melihat apakah itu bilangan prima. Anda ingin menghindari kode Anda melakukan perhitungan boros dan Anda dapat menemukan daftar bilangan prima dalam rentang yang Anda inginkan online. Anda bisa menggunakan pernyataan peralihan besar-besaran untuk membandingkan setiap nilai dengan bilangan prima yang diketahui.

Atau Anda bisa saja membuat peta array bilangan prima dan mendapatkan hasil langsung:

    bool[] Primes = new bool[] {
        false, false, true, true, false, true, false,    
        true, false, false, false, true, false, true,
        false,false,false,true,false,true,false};
    private void button1_Click(object sender, EventArgs e) {
        int Value = Convert.ToInt32(textBox1.Text);
        if ((Value >= 0) && (Value < Primes.Length)) {
            bool IsPrime = Primes[Value];
            textBox2.Text = IsPrime.ToString();
        }
    }

Mungkin Anda ingin melihat apakah karakter dalam string adalah heksadesimal. Anda bisa menggunakan statement switch yang jelek dan agak besar.

Atau Anda bisa menggunakan ekspresi reguler untuk menguji char atau menggunakan fungsi IndexOf untuk mencari char dalam serangkaian huruf heksadesimal yang diketahui:

        private void textBox2_TextChanged(object sender, EventArgs e) {
        try {
            textBox1.Text = ("0123456789ABCDEFGabcdefg".IndexOf(textBox2.Text[0]) >= 0).ToString();
        } catch {
        }
    }

Katakanlah Anda ingin melakukan salah satu dari 3 tindakan berbeda tergantung pada nilai yang akan menjadi kisaran 1 hingga 24. Saya akan menyarankan menggunakan seperangkat pernyataan IF. Dan jika itu menjadi terlalu kompleks (Atau angkanya lebih besar seperti 5 tindakan berbeda tergantung pada nilai dalam kisaran 1 hingga 90) maka gunakan enum untuk menentukan tindakan dan membuat peta susunan enum. Nilai tersebut kemudian akan digunakan untuk mengindeks ke dalam peta array dan mendapatkan enum dari tindakan yang Anda inginkan. Kemudian gunakan baik set kecil pernyataan IF atau pernyataan beralih yang sangat sederhana untuk memproses nilai enum yang dihasilkan.

Selain itu, hal yang menyenangkan tentang sebuah array map yang mengubah serangkaian nilai menjadi aksi adalah ia dapat dengan mudah diubah oleh kode. Dengan kode berkabel, Anda tidak dapat dengan mudah mengubah perilaku saat runtime tetapi dengan peta larik itu mudah.

Darin
sumber
Anda juga dapat memetakan ke ekspresi lambda atau delegasi
Conrad Frix
Poin bagus. Satu komentar kecil: Saya biasanya merasa lebih mudah untuk mempertahankan daftar nilai yang cocok dengan kasus yang diberikan, daripada peta array. Masalah dengan peta susunan adalah mudahnya membuat kesalahan. Sebagai contoh, alih-alih peta larik primes dari true / falses, cukup miliki daftar bilangan prima, dan muatkan ke dalam HashSet untuk kinerja pencarian. Sekalipun ada lebih dari dua case, biasanya semuanya kecuali satu case adalah daftar kecil, jadi buatlah HashSet enum (jika jarang) atau array map, dalam kode, dari daftar case lainnya.
ToolmakerSteve
1

Hanya untuk menambah percakapan, menggunakan .NET 4.6.2 saya juga bisa melakukan hal berikut. Saya menguji kodenya dan itu berhasil untuk saya.

Anda juga dapat melakukan beberapa pernyataan "ATAU", seperti di bawah ini:

            switch (value)
            {
                case string a when a.Contains("text1"):
                    // Do Something
                    break;
                case string b when b.Contains("text3") || b.Contains("text4") || b.Contains("text5"):
                    // Do Something else
                    break;
                default:
                    // Or do this by default
                    break;
            }

Anda juga dapat memeriksa apakah cocok dengan nilai dalam array:

            string[] statuses = { "text3", "text4", "text5"};

            switch (value)
            {
                case string a when a.Contains("text1"):
                    // Do Something
                    break;
                case string b when statuses.Contains(value):                        
                    // Do Something else
                    break;
                default:
                    // Or do this by default
                    break;
            }
JeffS
sumber
Bukankah ini tergantung pada versi C #, bukan versi .NET?
Peter Mortensen
1

Jika Anda memiliki jumlah string yang sangat besar (atau tipe lainnya) semua melakukan hal yang sama, saya merekomendasikan penggunaan daftar string yang dikombinasikan dengan string. Properti berisi.

Jadi, jika Anda memiliki pernyataan beralih besar seperti:

switch (stringValue)
{
    case "cat":
    case "dog":
    case "string3":
    ...
    case "+1000 more string": // Too many string to write a case for all!
        // Do something;
    case "a lonely case"
        // Do something else;
    .
    .
    .
}

Anda mungkin ingin menggantinya dengan ifpernyataan seperti ini:

// Define all the similar "case" string in a List
List<string> listString = new List<string>(){ "cat", "dog", "string3", "+1000 more string"};
// Use string.Contains to find what you are looking for
if (listString.Contains(stringValue))
{
    // Do something;
}
else
{
    // Then go back to a switch statement inside the else for the remaining cases if you really need to
}

Skala ini baik untuk sejumlah kasus tali.

Maxter
sumber
-5

Untuk ini, Anda akan menggunakan pernyataan goto. Seperti:

    switch(value){
    case 1:
        goto case 3;
    case 2:
        goto case 3;
    case 3:
        DoCase123();
    //This would work too, but I'm not sure if it's slower
    case 4:
        goto case 5;
    case 5:
        goto case 6;
    case 6:
        goto case 7;
    case 7:
        DoCase4567();
    }
scone
sumber
7
@scone goto mematahkan prinsip dasar pemrograman prosedural (yang c ++ dan c # masih di-root; mereka bukan bahasa OO murni (terima kasih Tuhan)). Pemrograman prosedural memiliki aliran logika yang ditentukan dengan baik ditentukan oleh konstruksi bahasa dan konvensi pemanggilan metode (bagaimana tumpukan runtime tumbuh dan menyusut). Pernyataan kebalikan dari aliran ini dengan memungkinkan melompat secara sewenang-wenang, pada dasarnya.
samis
1
Saya tidak mengatakan itu gaya yang baik, persay, tapi itu melakukan apa yang diminta pertanyaan asli.
scone
2
Tidak, itu tidak "melakukan apa yang diminta pertanyaan asli". Pertanyaan aslinya memiliki kode yang berfungsi apa adanya . Mereka tidak membutuhkannya diperbaiki. Dan bahkan jika mereka melakukannya, ini adalah saran yang mengerikan. Itu kurang ringkas, dan menggunakan goto. Lebih buruk lagi, ini adalah penggunaan yang sama sekali tidak perlu goto, karena sintaks asli yang dinyatakan oleh OP berfungsi. Pertanyaannya adalah apakah ada cara yang lebih ringkas untuk memberikan kasus pengganti. Seperti yang orang-orang jawab bertahun-tahun sebelum Anda melakukannya , ya ada - jika Anda bersedia meletakkan beberapa kasing dalam satu baris case 1: case 2:, dan jika gaya editor otomatis memungkinkan.
ToolmakerSteve
Satu-satunya alasan goto bertekad buruk adalah karena beberapa orang merasa sulit untuk mengikuti alur logika. .Net MSIL (assembled object code) menggunakan goto all over karena itu cepat, tetapi jika. Net code dapat ditulis dan sama seperti performant tanpa mereka, lebih baik tidak menggunakannya dan agar Anda tidak dinyalakan oleh orang-orang seperti @ Jawaban merendahkan ToolmakerSteve.
dynamiclynk
@wchoward - Harap baca balasan saya lebih hati-hati. Keluhan saya bukan hanya tentang penggunaan goto . Saya keberatan karena pertanyaannya menunjukkan kode yang sudah berfungsi sebagaimana mestinya , dan jawaban ini a) mengambil kode kerja itu dan membuatnya lebih bertele-tele, dan kurang terstruktur dengan baik, tanpa manfaat , b) tidak menjawab pertanyaan.
ToolmakerSteve