Pertanyaan Mengapa buruk untuk menyediakan operator String implisit (char [])?


Kita dapat:

var t=new String(new[] { '繁', '體', '中', '文' });

atau

var encoding=Encoding.Unicode;
var bytes=encoding.GetBytes(new[] { 'E', 'n', 'g', 'l', 'i', 's', 'h' });
var t=encoding.GetString(bytes);

Tanpa suka seperti:

public static implicit operator String(char[] charArray) {
    return new String(charArray);
}

Kita tidak bisa:

String t=new[] { 'р', 'у', 'с', 'с', 'к', 'и', 'й', '\x20', 'я', 'з', 'ы', 'к' };

saya tahu itu array karakter tidak sama dengan string; tapi kadang-kadang saya hanya ingin menetapkan array karakter ke string secara langsung; tanpa eksplisit casting, mengubah atau new X(new Y(new Z ....

Dan saya pikir, secara pribadi, alasan itu tidak disediakan mungkin karena:
Tim C-Sharp menginginkan para programmer, terutama yang memiliki pengalaman C ++ / C untuk mengingat hal itu C-Sharp TIDAK sama seperti C ++ atau C.

Pertanyaannya adalah MENGAPA tidak? Apakah itu buruk?


4
2018-01-11 17:23


asal


Jawaban:


Konversi implisit adalah fitur kompilator. Tidak ada spesifikasi CLI yang mengizinkannya, semua konversi dalam IL bersifat eksplisit. Bahkan yang sederhana seperti int panjang dan melayang menjadi dua kali lipat. Jadi terserah kepada tim C # dalam kasus Anda untuk membuat sintaks itu berfungsi.

Cara tim C # berpikir tentang itu dipublikasikan dengan baik. Setiap fitur yang mungkin dimulai pada -100 poin dan membutuhkan beberapa motivasi serius untuk mencapai +100 untuk membenarkan pekerjaan yang terlibat dengan merancang fitur, mengimplementasikannya, mendokumentasikannya dan menjaganya. Saya tidak bisa berbicara untuk mereka, tapi saya benar-benar ragu yang satu ini berhasil melewati 0. Alternatifnya jelas dan sederhana sehingga tidak layak.


4
2018-01-11 17:53



Saya tidak tahu ada dokumentasi khusus di luar sana mengapa mereka tidak menyertakan fungsi ini.

Dugaan saya adalah bahwa mereka memiliki sejumlah fitur terbatas yang dapat mereka terapkan dengan setiap rilis .NET dan pada akhirnya mereka memutuskan bahwa jumlah orang yang akan menemukan fitur ini bermanfaat tidak membenarkan menghabiskan waktu untuk menerapkannya. (terutama mengingat bahwa ada konstruktor yang melakukan apa yang Anda inginkan).

saya menemukan pertanyaan ini dan sementara itu tidak langsung menjawab pertanyaan Anda itu masuk ke beberapa perbedaan penting antara array char dan string dalam. NET. Dalam. NET string tidak sama dengan array karakter (karena mungkin di C ++). Mungkin mereka mencoba untuk menimang konsep rumah ini.


1
2018-01-11 17:25



Anda selalu dapat memiliki sesuatu seperti:

char[] chars = { 'a','b','c','d' };
string s = new string(chars);

0
2018-01-11 17:29



Array karakter tidak sama dengan string, jadi Anda tidak dapat menugaskannya secara langsung. Itu sepertinya sama bagusnya dengan alasan bagiku.

Saya akan melakukan sesuatu seperti ini:

char[] arr = { 'a', 'b', 'c' };
string s = new String(arr);

0
2018-01-11 17:30



Di pustaka kelas dasar, Anda akan sulit sekali menemukan contoh konversi konversi representasi implisit (atau eksplisit) yang tidak melibatkan terutama jenis nilai (saat ini saya hanya dapat memikirkan jumlah konversi antara byte, short, int, long, float, double dan varian bertandatangan / tidak ditandatangani).

Adapun alasannya bahwa konversi tidak diterapkan ...

  • Array karakter dan string sangat berbeda dalam perilakunya;
  • Kerugian dalam keterbacaan / dimengerti lebih tinggi daripada keuntungan dalam kenyamanan pengembang;
    • Dapatkan dalam kenyamanan pengembang: 12 karakter kurang untuk mengetik;
    • Kehilangan keterbacaan:
      • Pembaca harus tahu:
      • Bahwa konversi itu ada;
      • Apakah variabel target adalah a string atau a char[];
      • Bahwa konversi membuat dan mengalokasikan yang baru string obyek;

0
2018-01-11 17:59



Bagaimana kompiler harus memahami jenis apa yang Anda gunakan?

void DoIt(string data)
{
}

void DoIt(char[] data)
{
}

yang mana dari metode ini yang harus dipanggil?

DoIt(new[] { 'р', 'у', 'с', 'с', 'к', 'и', 'й', ' ', 'я', 'з', 'ы', 'к' })

meninggalkan fungsi ini hanya untuk menetapkan akan terlihat seperti gula sintaks yang dirancang dengan buruk.


0
2018-01-11 18:00