Pertanyaan Apa perbedaan antara String dan string dalam C #?


Contoh (catat kasusnya):

string s = "Hello world!";
String s = "Hello world!";

Apa itu pedoman untuk penggunaan masing-masing? Dan apa itu perbedaan?


5345


asal


Jawaban:


string adalah alias dalam C # for System.String.
Jadi secara teknis, tidak ada perbedaan. Itu seperti int  vs.  System.Int32.

Sejauh pedoman, umumnya dianjurkan untuk digunakan string kapan pun Anda merujuk ke suatu objek.

misalnya

string place = "world";

Demikian juga, saya pikir itu umumnya disarankan untuk digunakan String jika Anda perlu merujuk khusus ke kelas.

misalnya

string greet = String.Format("Hello {0}!", place);

Ini adalah gaya yang cenderung digunakan Microsoft contoh mereka.


Tampaknya panduan di area ini mungkin telah berubah, seperti StyleCop sekarang memberlakukan penggunaan alias khusus C #.


5088



Hanya demi kelengkapan, inilah otak informasi terkait ...

Seperti yang dicatat orang lain, string adalah alias untuk System.String. Mereka mengkompilasi ke kode yang sama, jadi pada waktu eksekusi tidak ada perbedaan sama sekali. Ini hanyalah salah satu alias di C #. Daftar lengkapnya adalah:

object:  System.Object
string:  System.String
bool:    System.Boolean
byte:    System.Byte
sbyte:   System.SByte
short:   System.Int16
ushort:  System.UInt16
int:     System.Int32
uint:    System.UInt32
long:    System.Int64
ulong:   System.UInt64
float:   System.Single
double:  System.Double
decimal: System.Decimal
char:    System.Char

Selain string dan object, alias semua untuk menghargai jenis. decimal adalah tipe nilai, tetapi bukan tipe primitif dalam CLR. Satu-satunya tipe primitif yang tidak memiliki alias System.IntPtr.

Dalam spec, alias jenis nilai dikenal sebagai "tipe sederhana". Literal dapat digunakan untuk nilai konstan dari setiap tipe sederhana; tidak ada jenis nilai lain yang memiliki bentuk literal. (Bandingkan ini dengan VB, yang memungkinkan DateTime literal, dan memiliki alias untuk itu juga.)

Ada satu keadaan di mana Anda memiliki untuk menggunakan alias: ketika secara eksplisit menentukan tipe dasar enum. Contohnya:

public enum Foo : UInt32 {} // Invalid
public enum Bar : uint   {} // Valid

Itu hanya masalah cara spec mendefinisikan enum deklarasi - bagian setelah titik dua harus menjadi tipe integral produksi, yang merupakan salah satu token sbyte, byte, short, ushort, int, uint, long, ulong, char... Berbeda dengan a mengetik produksi seperti yang digunakan oleh deklarasi variabel misalnya. Itu tidak menunjukkan perbedaan lain.

Akhirnya, ketika datang ke mana untuk digunakan: secara pribadi saya menggunakan alias di mana-mana untuk implementasi, tetapi jenis CLR untuk setiap API. Ini benar-benar tidak terlalu penting yang Anda gunakan dalam hal implementasi - konsistensi di antara tim Anda bagus, tetapi tidak ada orang lain yang akan peduli. Di sisi lain, sangat penting bahwa jika Anda merujuk ke jenis dalam API, Anda melakukannya dengan cara bahasa yang netral. Metode yang disebut ReadInt32 tidak ambigu, sedangkan metode yang disebut ReadInt membutuhkan interpretasi. Penelepon bisa menggunakan bahasa yang menentukan int alias untuk Int16, sebagai contoh. Perancang kerangka NET. Telah mengikuti pola ini, contoh yang baik berada di BitConverter, BinaryReader dan Convert kelas.


3031



String berdiri untuk System.String dan itu adalah tipe .NET Framework. string adalah alias dalam bahasa C # untuk System.String. Keduanya dikompilasi ke System.String di IL(Bahasa Menengah), jadi tidak ada perbedaan. Pilih apa yang Anda suka dan gunakan itu. Jika Anda kode di C #, saya lebih suka string karena ini adalah alias tipe C # dan dikenal oleh programmer C #.

Saya bisa mengatakan hal yang sama (int, System.Int32) dll ..


607



Jawaban terbaik yang pernah saya dengar tentang penggunaan jenis alias yang disediakan di C # berasal dari Jeffrey Richter dalam bukunya CLR Via C #. Berikut 3 alasannya:

  • Saya telah melihat sejumlah pengembang bingung, tidak tahu apakah akan digunakan tali atau Tali dalam kode mereka. Karena dalam C # string (kata kunci) memetakan persis ke System.String (tipe FCL), tidak ada perbedaan dan dapat digunakan.
  • Di C #, panjang peta ke System.Int64, tetapi dalam bahasa pemrograman yang berbeda, panjang bisa memetakan ke Int16 atau Int32. Bahkan, C ++ / CLI sebenarnya memperlakukan panjang sebagai Int32. Seseorang yang membaca kode sumber dalam satu bahasa dapat dengan mudah salah menafsirkan niat kode jika dia terbiasa dengan pemrograman dalam bahasa pemrograman yang berbeda. Bahkan, sebagian besar bahasa bahkan tidak akan memperlakukan panjang sebagai kata kunci dan tidak akan mengkompilasi kode yang menggunakannya.
  • FCL memiliki banyak metode yang memiliki nama jenis sebagai bagian dari nama metode mereka. Misalnya, BinaryReader ketik menawarkan metode seperti ReadBoolean, BacaInt32, ReadSingle, dan seterusnya, dan System.Convert ketik menawarkan metode seperti ToBoolean, ToInt32, ToSingle, dan seterusnya. Meskipun legal untuk menulis kode berikut, garis dengan pelampung terasa sangat tidak wajar bagi saya, dan tidak jelas bahwa garisnya benar:
BinaryReader br = new BinaryReader(...);
float val  = br.ReadSingle(); // OK, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good

Jadi begitulah. Saya pikir ini semua adalah poin yang sangat bagus. Namun saya tidak menemukan diri saya menggunakan saran Jeffrey dalam kode saya sendiri. Mungkin saya terlalu terjebak di dunia C # tetapi saya akhirnya mencoba membuat kode saya terlihat seperti kode kerangka.


409



string adalah kata pendiam, tapi String hanya nama kelas. Ini artinya itu string tidak dapat digunakan sebagai nama variabel dengan sendirinya.

Jika karena alasan tertentu Anda menginginkan variabel yang disebut tali, Anda hanya akan melihat yang pertama dari kompilasi ini:

StringBuilder String = new StringBuilder();  // compiles
StringBuilder string = new StringBuilder();  // doesn't compile 

Jika Anda benar-benar ingin nama variabel disebut tali Kamu dapat memakai @ sebagai awalan:

StringBuilder @string = new StringBuilder();

Perbedaan penting lainnya: Stack Overflow menyoroti keduanya secara berbeda.


380



Ada satu perbedaan - Anda tidak bisa menggunakannya String tanpa using System; sebelumnya.


327



Sudah dibahas di atas; namun, Anda tidak bisa menggunakannya string dalam refleksi; Anda harus menggunakannya String.


269



System.String adalah kelas. NET string - di C # string adalah alias untuk System.String - Jadi dalam penggunaannya mereka sama.

Adapun panduan saya tidak akan terlalu macet dan hanya menggunakan mana saja yang Anda suka - ada hal-hal yang lebih penting dalam hidup dan kode itu akan tetap sama.

Jika Anda menemukan diri Anda membangun sistem di mana perlu untuk menentukan ukuran bilangan bulat yang Anda gunakan dan cenderung menggunakan Int16, Int32, UInt16, UInt32 dll. maka mungkin terlihat lebih alami untuk digunakan String- dan ketika bergerak di antara bahasa .net yang berbeda mungkin membuat hal-hal lebih dimengerti - jika tidak saya akan menggunakan string dan int.


204



Saya lebih suka huruf besar .NET jenis (bukan alias) untuk alasan pemformatan. Itu .NET jenisnya berwarna sama dengan jenis objek lain (jenis nilai adalah objek yang tepat, setelah semua).

Kata kunci kondisional dan kontrol (seperti if, switch, dan return) adalah huruf kecil dan berwarna biru gelap (secara default). Dan saya lebih suka tidak memiliki ketidaksepakatan dalam penggunaan dan format.

Mempertimbangkan:

String someString; 
string anotherString; 

167



string dan String identik dalam semua cara (kecuali huruf besar "S"). Tidak ada implikasi kinerja yang baik.

Huruf Kecil string lebih disukai di sebagian besar proyek karena penyorotan sintaks


166



C # adalah bahasa yang digunakan bersama dengan CLR.

string adalah tipe dalam C #.

System.String adalah tipe di CLR.

Ketika Anda menggunakan C # bersama dengan CLR string akan dipetakan System.String.

Secara teoritis, Anda bisa menerapkan C # -compiler yang dihasilkan bytecode Java. Implementasi yang masuk akal dari kompilator ini mungkin akan dipetakan string untuk java.lang.String untuk melakukan interoperasi dengan pustaka runtime Java.


154