Domanda Qual è la differenza tra stringa e stringa in C #?


Esempio ( nota il caso ):

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

Quali sono le linee guida  per l'uso di ciascuno? E quali sono i differenze ?


5341


origine


risposte:


string è un alias in C # per System.String.
Quindi tecnicamente, non c'è differenza. È come int  vs.   System.Int32.

Per quanto riguarda le linee guida, è generalmente consigliato l'uso string ogni volta che ti stai riferendo a un oggetto.

per esempio.

string place = "world";

Allo stesso modo, penso che sia generalmente consigliato l'uso String se hai bisogno di riferirti specificamente alla classe.

per esempio.

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

Questo è lo stile in cui tende a utilizzare Microsoft i loro esempi .


Sembra che la guida in quest'area possa essere cambiata, come StyleCop  ora impone l'uso degli alias specifici di C #.


5082



Solo per completezza, ecco una discarica cerebrale di informazioni correlate ...

Come altri hanno notato, string è un alias per System.String. Compilano lo stesso codice, quindi al momento dell'esecuzione non c'è alcuna differenza. Questo è solo uno degli alias in C #. L'elenco completo è:

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

Oltre ad string e object, gli alias sono tutti da valutare. decimal è un tipo di valore, ma non un tipo primitivo nel CLR. L'unico tipo primitivo che non ha un alias è System.IntPtr.

Nella specifica, gli alias di tipo valore sono noti come "tipi semplici". I letterali possono essere usati per valori costanti di ogni tipo semplice; nessun altro tipo di valore ha forme letterali disponibili. (Confronta questo con VB, che consente DateTime letterali, e ha un alias anche per questo.)

C'è una circostanza in cui tu avere  usare gli alias: quando si specifica esplicitamente il tipo sottostante di un enum. Per esempio:

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

Questo è solo il modo in cui le specifiche definiscono le dichiarazioni enum - la parte dopo il colon deve essere il integrale di tipo  produzione, che è un segno di sbyte, byte, short, ushort, int, uint, long, ulong, char... al contrario di a genere  produzione come utilizzata dalle dichiarazioni variabili, ad esempio. Non indica altre differenze.

Infine, quando si tratta di usare: personalmente uso gli alias ovunque per l'implementazione, ma il tipo CLR per qualsiasi API. Non importa molto che usi in termini di implementazione: la coerenza tra la tua squadra è buona, ma a nessun altro interesserà. D'altra parte, è davvero importante che se si fa riferimento a un tipo in un'API, lo si fa in una lingua neutrale. Un metodo chiamato ReadInt32 è univoco, mentre un metodo chiamato ReadInt richiede interpretazione Il chiamante potrebbe utilizzare un linguaggio che definisce un int alias per Int16, per esempio. I progettisti di framework .NET hanno seguito questo modello, con buoni esempi nel BitConverter, BinaryReader e Convert classi.


3028



String sta per System.String ed è un tipo di .NET Framework. string è un alias  nel linguaggio C # per System.String. Entrambi sono compilati per System.Stringin IL  (Lingua intermedia), quindi non c'è differenza. Scegli quello che ti piace e usalo. Se si scrive in C #, preferirei string poiché è un alias di tipo C # e ben noto dai programmatori C #.

Posso dire lo stesso di ( int, System.Int32)  eccetera..


606



La migliore risposta che abbia mai sentito sull'uso degli alias di tipo fornito in C # viene da Jeffrey Richter nel suo libro CLR Via C # . Ecco i suoi 3 motivi:

  • Ho visto un certo numero di sviluppatori confusi, non sapendo se usare stringa  o Stringa  nel loro codice. Perché in C # la stringa (una parola chiave) viene mappata esattamente su System.String (un tipo FCL), non vi è alcuna differenza e può essere utilizzato.
  • In C #, lungo  mappe a System.Int64 , ma in un linguaggio di programmazione diverso, lungo  potrebbe mappare a un Int16  o Int32 . In effetti, C ++ / CLI in realtà trattano a lungo come un Int32 . Qualcuno che legge il codice sorgente in una lingua potrebbe facilmente interpretare erroneamente l'intenzione del codice se fosse abituato a programmare in un linguaggio di programmazione diverso. In effetti, la maggior parte delle lingue non tratterà nemmeno lungo  come parola chiave e non compilerà il codice che lo utilizza.
  • La FCL ha molti metodi che hanno nomi di tipi come parte dei loro nomi di metodi. Ad esempio, il BinaryReader  tipo offre metodi come readBoolean , ReadInt32 , ReadSingle e così via e il System.Convert  tipo offre metodi come ToBoolean , ToInt32 , ToSingle , e così via. Sebbene sia legale scrivere il seguente codice, la linea con float mi sembra molto innaturale, e non è ovvio che la linea sia corretta:
BinaryReader br = new BinaryReader(...);
float val  = br.ReadSingle(); // OK, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good

Così il gioco è fatto. Penso che questi siano davvero ottimi punti. Tuttavia, non mi trovo a usare il consiglio di Jeffrey nel mio codice. Forse sono troppo bloccato nel mio mondo C # ma finisco per cercare di rendere il mio codice simile al codice quadro.


408



string è una parola riservata, ma String è solo un nome di classe. Ciò significa che string non può essere usato come nome di variabile da solo.

Se per qualche motivo volevi una variabile chiamata stringa , vedresti solo la prima di queste compilazioni:

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

Se vuoi davvero che venga chiamato un nome di variabile stringa  Puoi usare @ come prefisso:

StringBuilder @string = new StringBuilder();

Un'altra differenza fondamentale: Stack Overflow li evidenzia in modo diverso.


379



C'è una differenza  - Non puoi usare String senza using System; in anticipo.


326



È stato coperto sopra; tuttavia, non è possibile utilizzare string in riflessione; devi usare String.


268



System.String è la classe di stringa .NET - in C # string è un alias per System.String - Così in uso sono uguali.

Per quanto riguarda le linee guida, non mi sento troppo impantanato e uso solo quello che vuoi - ci sono cose più importanti nella vita e il codice sarà lo stesso comunque.

Se vi trovate a costruire sistemi dove è necessario specificare la dimensione degli interi che state usando e quindi tendenzialmente utilizzare Int16, Int32, UInt16, UInt32 ecc. allora potrebbe sembrare più naturale da usare String- e quando si spostano tra diversi linguaggi .net potrebbe rendere le cose più comprensibili - altrimenti userei string e int.


203



Preferisco la maiuscola .NET tipi (piuttosto che gli alias) per ragioni di formattazione. Il .NET i tipi sono colorati come gli altri tipi di oggetto (i tipi di valore sono oggetti corretti, dopotutto).

Parole chiave condizionali e di controllo (come if, switch, e return) sono in minuscolo e di colore blu scuro (impostazione predefinita). E preferirei non avere il disaccordo in uso e formato.

Prendere in considerazione:

String someString; 
string anotherString; 

167



string e String sono identici in tutti i modi (eccetto la "S" maiuscola). Non ci sono implicazioni di performance in entrambi i casi.

Minuscolo string è preferito nella maggior parte dei progetti a causa dell'evidenziazione della sintassi


166



C # è un linguaggio che viene utilizzato insieme al CLR.

string è un tipo in C #.

System.String è un tipo nel CLR.

Quando si utilizza C # insieme al CLR string sarà mappato a System.String.

In teoria, è possibile implementare un compilatore C # che ha generato un bytecode Java. Un'implementazione ragionevole di questo compilatore probabilmente verrebbe mappata string a java.lang.String per interagire con la libreria runtime Java.


154