Domanda

Esempio (notare 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?

È stato utile?

Soluzione

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

Per quanto riguarda le linee guida, se ne consiglia generalmente l'utilizzo string ogni volta che ti riferisci a un oggetto.

per esempio.

string place = "world";

Allo stesso modo, penso che sia generalmente consigliato l'uso String se è necessario fare riferimento specificamente alla classe.

per esempio.

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

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

Sembra che le linee guida in questo settore potrebbero essere cambiate, come StyleCop ora impone l'uso degli alias specifici di C#.

Altri suggerimenti

Solo per ragioni di completezza, ecco un brain dump delle informazioni correlate...

Come altri hanno notato, string è un alias per System.String.Compilano con 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

A parte string E object, gli alias sono tutti tipi di valore. decimal è un tipo di valore, ma non un tipo primitivo in CLR.L'unico tipo primitivo che non ha un alias è System.IntPtr.

Nelle specifiche, gli alias dei tipi di valore sono conosciuti come "tipi semplici".I valori letterali possono essere utilizzati 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 anche un alias per questo.)

C'è una circostanza in cui tu Avere per utilizzare gli alias:quando si specifica esplicitamente il tipo sottostante di un'enumerazione.Ad esempio:

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

È solo una questione di come le specifiche definiscono le dichiarazioni enum: la parte dopo i due punti deve essere the di tipo integrale produzione, che ne è un segno sbyte, byte, short, ushort, int, uint, long, ulong, char...al contrario di a tipo produzione come utilizzato ad esempio dalle dichiarazioni di variabile.Non indica nessun'altra differenza.

Infine, quando si tratta di quale utilizzare:personalmente utilizzo gli alias ovunque per l'implementazione, ma il tipo CLR per qualsiasi API.In realtà non importa troppo quale usi in termini di implementazione: la coerenza all'interno del tuo team è positiva, ma a nessun altro importerà.D'altro canto, è veramente importante che se si fa riferimento a un tipo in un'API, lo si faccia in modo neutro dal punto di vista linguistico.Un metodo chiamato ReadInt32 non è ambiguo, mentre un metodo chiamato ReadInt richiede interpretazione.Il chiamante potrebbe utilizzare un linguaggio che definisce an int alias per Int16, Per esempio.I progettisti di .NET framework hanno seguito questo modello, buoni esempi sono in BitConverter, BinaryReader E Convert classi.

String sta per System.String ed è un tipo .NET Framework. string è uno pseudonimo nel linguaggio C# per System.String.Entrambi sono compilati System.String nell'IL (Linguaggio Intermedio), quindi non c'è differenza.Scegli quello che ti piace e usalo.Se codifichi in C#, preferirei string poiché è un alias di tipo C# e ben noto ai programmatori C#.

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

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

  • Ho visto un certo numero di sviluppatori confusi, non sapendo se utilizzare corda O Corda nel loro codice.Poiché in C# la stringa (una parola chiave) è mappata esattamente a System.String (un tipo FCL), non vi è alcuna differenza ed è possibile utilizzare l'uno o l'altro.
  • 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 tratta infatti long come an Int32.Qualcuno che legge il codice sorgente in una lingua potrebbe facilmente fraintendere le intenzioni del codice se fosse abituato a programmare in un linguaggio di programmazione diverso.In effetti, la maggior parte delle lingue non tratta nemmeno lungo come parola chiave e non compilerà il codice che la utilizza.
  • La FCL dispone di molti metodi che hanno nomi di tipo come parte dei nomi dei metodi.Ad esempio, il BinaryReader type offre metodi come LeggiBooleano, LeggiInt32, LeggiSingolo, e così via, e il System.Convert type offre metodi come ToBooleano, ToInt32, ASingolo, e così via.Sebbene sia legale scrivere il seguente codice, la riga con float mi sembra molto innaturale e non è ovvio che la riga 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 tutti punti davvero positivi.Tuttavia, non mi ritrovo a utilizzare il consiglio di Jeffrey nel mio codice.Forse sono troppo bloccato nel mio mondo C# ma finisco per provare a far sembrare il mio codice simile al codice del framework.

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

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

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

Se vuoi davvero che il nome di una variabile venga chiamato corda Puoi usare @ come prefisso:

StringBuilder @string = new StringBuilder();

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

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

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

System.String è la classe stringa .NET - in C# string è un alias per System.String - quindi in uso sono gli stessi.

Per quanto riguarda le linee guida, non mi impantanerei troppo e userei semplicemente quello che preferisci: ci sono cose più importanti nella vita e il codice sarà comunque lo stesso.

Se vi trovate a costruire sistemi in cui è necessario specificare la dimensione degli interi che state utilizzando e quindi tendete ad usare Int16, Int32, UInt16, UInt32 eccetera.allora potrebbe sembrare più naturale da usare String - e quando ci si sposta tra diversi linguaggi .net potrebbe rendere le cose più comprensibili, altrimenti utilizzerei string e int.

Preferisco la maiuscola .NET tipi (anziché gli alias) per motivi di formattazione.IL .NET i tipi sono colorati allo stesso modo degli altri tipi di oggetto (dopo tutto i tipi di valore sono oggetti veri e propri).

Parole chiave condizionali e di controllo (come if, switch, E return) sono minuscoli e colorati in blu scuro (per impostazione predefinita).E preferirei non avere disaccordi nell'uso e nel formato.

Prendere in considerazione:

String someString; 
string anotherString; 

string E String sono identici in tutti i sensi (eccetto la "S" maiuscola).In ogni caso non ci sono implicazioni sulle prestazioni.

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

C# è un linguaggio utilizzato insieme a CLR.

string è un tipo in C#.

System.String è un tipo in CLR.

Quando usi C# insieme a CLR string verrà mappato su System.String.

In teoria, potresti implementare un compilatore C# che generi bytecode Java.Un'implementazione sensata di questo compilatore probabilmente mapperebbe string A java.lang.String per poter interagire con la libreria runtime Java.

Questo YouTube il video mostra praticamente come differiscono.

Ma ora una lunga risposta testuale.

Quando parliamo di .NET ci sono due cose diverse una sola c'è .NET framework e l'altro ci sono linguaggi ( C# , VB.NET ecc) che utilizzano tale framework.

enter image description here

"System.String" alias "Stringa" ("S" maiuscola) è a .NET tipo di dati framework mentre "string" è un C# tipo di dati.

enter image description here

In breve "String" è un alias (la stessa cosa chiamata con nomi diversi) di "string".Quindi tecnicamente entrambe le istruzioni del codice seguente forniranno lo stesso output.

String s = "I am String";

O

string s = "I am String";

Allo stesso modo ci sono alias per altri tipi di dati C# come mostrato di seguito: -

oggetto: System.Object, corda: System.String, bool: System.Boolean, byte: System.Byte, sbyte: System.SByte, corto: System.Int16 e così via

Ora la domanda da un milione di dollari dal punto di vista del programmatore Allora quando usare "String" e "string"?

La prima cosa per evitare confusione è usarne uno in modo coerente.Ma dal punto di vista delle migliori pratiche quando si esegue la dichiarazione di variabile è bene usare "string" ("s" minuscola) e quando la si utilizza come nome di classe, è preferibile "String" ("S" maiuscola).

Nel codice seguente il lato sinistro è una dichiarazione di variabile e viene dichiarata utilizzando "string".Sul lato destro stiamo chiamando un metodo quindi "String" è più sensato.

string s = String.ToUpper() ;

Minuscolo string è un alias per System.String.Sono gli stessi dentro C#.

È in corso un dibattito sull'opportunità di utilizzare i tipi di sistema (System.Int32, System.String, ecc.) tipi o il C# aliases (int, string, eccetera).Personalmente credo che dovresti usare il file C# aliases, ma è solo una mia preferenza personale.

string è solo un alias per System.String.Il compilatore li tratterà in modo identico.

L'unica differenza pratica è l'evidenziazione della sintassi come dici tu e che devi scrivere using System se usi String.

Entrambi sono uguali.Ma dal punto di vista delle linee guida di codifica è meglio usarlo string invece di String.Questo è ciò che generalmente usano gli sviluppatori.per esempio.invece di usare Int32 noi usiamo int COME int è l'alias di Int32

FYI “La stringa di parole chiave è semplicemente un alias per la classe predefinita System.String. " - C# Specifiche linguistiche 4.2.3http://msdn2.microsoft.com/En-US/library/aa691153.aspx

Come dicono gli altri, sono uguali.Le regole di StyleCop, per impostazione predefinita, ti imporranno l'uso string come procedura consigliata per lo stile di codice C#, tranne quando si fa riferimento System.String funzioni statiche, come String.Format, String.Join, String.Concat, eccetera...

Nuova risposta dopo 6 anni e 5 mesi (procrastinazione).

Mentre string è una parola chiave C# riservata che ha sempre un significato fisso, String è semplicemente normale identificatore che potrebbe riferirsi a qualsiasi cosa.A seconda dei membri del tipo corrente, dello spazio dei nomi corrente e dell'applicazione using direttive e la loro collocazione, String potrebbe essere un valore o un tipo distinto da global::System.String.

Fornirò due esempi in cui using le direttive non aiuteranno.


Innanzitutto, quando String è un valore del tipo corrente (o una variabile locale):

class MySequence<TElement>
{
  public IEnumerable<TElement> String { get; set; }

  void Example()
  {
    var test = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
  }
}

Quanto sopra non verrà compilato perché IEnumerable<> non ha un membro non statico chiamato Format, e non si applicano metodi di estensione.Nel caso di cui sopra, potrebbe essere ancora possibile utilizzarlo String in altri contesti in cui a tipo è l'unica possibilità sintatticamente.Per esempio String local = "Hi mum!"; potrebbe essere OK (a seconda dello spazio dei nomi e using direttive).

Peggio:Detto String.Concat(someSequence) probabilmente (a seconda di usings) vai al metodo di estensione Linq Enumerable.Concat.Non andrà al metodo statico string.Concat.


In secondo luogo, quando String è un altro tipo, annidato all'interno del tipo corrente:

class MyPiano
{
  protected class String
  {
  }

  void Example()
  {
    var test1 = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
    String test2 = "Goodbye";
  }
}

Nessuna delle due affermazioni nel Example il metodo compila.Qui String è sempre un pianoforte corda, MyPiano.String.Nessun membro (static o no) Format esiste su di esso (o è ereditato dalla sua classe base).E il valore "Goodbye" non può essere convertito in esso.

L'uso dei tipi di sistema semplifica il porting tra C# e VB.Net, se ti piacciono questo genere di cose.

Contro quella che sembra essere una pratica comune tra gli altri programmatori, preferisco String Sopra string, giusto per evidenziare il fatto che String è un tipo di riferimento, come menzionato da Jon Skeet.

string è un alias (o una abbreviazione) di System.String.Ciò significa che digitando string intendevamo System.String.Puoi leggere di più nel link think: 'string' è un alias/abbreviazione di System.String.

Corda (System.String) è una classe nella libreria delle classi base.string (minuscolo) è un'opera riservata in C# che è un alias per System.String.Int32 vs int è una situazione simile così com'è Boolean vs. bool.Queste parole chiave specifiche del linguaggio C# consentono di dichiarare primitive in uno stile simile a C.

Vorrei solo aggiungere questo alla risposta di lfousts, dal libro di Ritchers:

La specifica del linguaggio C# afferma: "Per essere una questione di stile, l'uso della parola chiave è favorito dall'uso del nome del tipo di sistema completo". Non sono d'accordo con le specifiche linguistiche;Preferisco usare i nomi dei tipi FCL ed evitare completamente i nomi dei tipi primitivi.In effetti, vorrei che i compilatori non offrissero nemmeno i nomi dei tipi primitivi e gli sviluppatori forzati a utilizzare invece i nomi dei tipi FCL.Ecco le mie ragioni:

  • Ho visto diversi sviluppatori confusi, non sapendo se utilizzare cordaO Corda nel loro codice.Perché in C# corda (una parola chiave) corrisponde esattamente a System.String (un tipo FCL), non vi è alcuna differenza ed è possibile utilizzarli entrambi.Allo stesso modo, ho sentito alcuni sviluppatori dirlo int Rappresenta un numero intero a 32 bit quando l'applicazione è in esecuzione su un sistema operativo a 32 bit e che rappresenta un numero intero a 64 bit quando l'applicazione è in esecuzione su un sistema operativo a 64 bit.Questa affermazione è assolutamente falsa:in C#, un int Mappe sempre a System.Int32, e quindi rappresenta un numero intero a 32 bit indipendentemente dal sistema operativo su cui è in esecuzione il codice.Se i programmatori usassero Int32 Nel loro codice, allora anche questa potenziale confusione viene eliminata.

  • In C#, lungo mappe a System.Int64, ma in un linguaggio di programmazione diverso, lungopotrebbe mappare a un Int16 O Int32.In effetti, C++/CLI tratta lungo come un Int32.Qualcuno che legge il codice sorgente in una lingua potrebbe facilmente interpretare erroneamente l'intenzione del codice se fosse abituato alla programmazione in un linguaggio di programmazione diverso.In effetti, la maggior parte delle lingue non tratta nemmeno lungo Come parola chiave e non compila il codice che la utilizza.

  • La FCL dispone di molti metodi che hanno nomi di tipo come parte dei nomi dei metodi.Ad esempio, il BinaryReader type offre metodi come LeggiBooleano, LeggiInt32, LeggiSingolo, e così via, e il System.Convert type offre metodi come ToBooleano, ToInt32, ASingolo, e così via.Sebbene sia legale scrivere il seguente codice, la riga con galleggiante Mi sembra molto innaturale, e non è ovvio che la linea è corretta:

    BinaryReader br = new BinaryReader(...);
    float val = br.ReadSingle(); // OK, but feels unnatural
    Single val = br.ReadSingle(); // OK and feels good
    
  • Molti programmatori che usano C# tendono esclusivamente a dimenticare che altri linguaggi di programmazione possono essere utilizzati contro il CLR e per questo motivo, i C# -ismi si insinuano nel codice della libreria di classe.Ad esempio, la FCL di Microsoft è quasi esclusivamente scritta in C# e gli sviluppatori nel team FCL hanno ora introdotto metodi nella biblioteca come Vettore'S OttieniLongLength, che restituisce un Int64 valore che è a lungo In C# ma non in altre lingue (come C ++/CLI).Un altro esempio è System.Linq.Enumerable'S Conteggio lungo metodo.

Non ho avuto la sua opinione prima di aver letto l'intero paragrafo.

String non è una parola chiave e può essere utilizzata come identificatore mentre string è una parola chiave e non può essere utilizzata come identificatore.E dal punto di vista funzionale entrambi sono uguali.

Arrivare tardi alla festa:Utilizzo i tipi CLR il 100% delle volte (beh, tranne se costretto per usare il tipo C#, ma non ricordo quando è stata l'ultima volta).

Inizialmente ho iniziato a farlo anni fa, secondo i libri CLR di Ritchie.Per me aveva senso che tutti i linguaggi CLR alla fine dovessero essere in grado di supportare l'insieme di tipi CLR, quindi utilizzare i tipi CLR da soli ha fornito un codice più chiaro e possibilmente più "riutilizzabile".

Ora che lo faccio da anni, è un'abitudine e mi piace la colorazione che VS mostra per i tipi CLR.

L'unico vero aspetto negativo è che il completamento automatico utilizza il tipo C#, quindi finisco per ridigitare i tipi generati automaticamente per specificare invece il tipo CLR.

Inoltre, ora, quando vedo "int" o "string", mi sembra davvero sbagliato, come se stessi guardando il codice C degli anni '70.

È una questione di convenzione, davvero. string assomiglia più allo stile C/C++.La convenzione generale è quella di utilizzare qualunque scorciatoia fornita dalla lingua scelta (int/Int for Int32).Questo vale per "oggetto" e decimal anche.

In teoria questo potrebbe aiutare a trasferire il codice in un futuro standard a 64 bit in cui "int" potrebbe significare Int64, ma non è questo il punto e mi aspetterei che qualsiasi procedura guidata di aggiornamento ne modifichi alcuni int riferimenti a Int32 comunque per sicurezza.

Non c'è differenza.

La parola chiave C# string esegue il mapping al tipo .NET System.String - è un alias che rispetta le convenzioni di denominazione della lingua.

Allo stesso modo, int mappe a System.Int32.

C'è una citazione su questo problema da Il libro di Daniel Solis.

Tutti i tipi predefiniti sono mappati direttamente ai tipi .NET sottostanti.I nomi dei tipi C# (stringa) sono semplicemente alias per i tipi .NET (String o System.String), quindi l'uso dei nomi .NET funziona bene in modo sintattico, sebbene questo sia scoraggiato.All'interno di un programma C#, è necessario utilizzare i nomi C# anziché i nomi .NET.

corda è una parola chiave e non puoi utilizzare la stringa come identificatore.

Corda non è una parola chiave e puoi usarla come identificatore:

Esempio

string String = "I am a string";

La parola chiave string è un alias per System.String A parte il problema delle parole chiave, i due sono esattamente equivalenti.

 typeof(string) == typeof(String) == typeof(System.String)

Sì, non c'è differenza tra loro, proprio come il bool E Boolean.

Non c'è differenza tra i due - string, tuttavia, sembra essere l'opzione preferita se si considera il codice sorgente di altri sviluppatori.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top