Perché .NET aggiunge una barra aggiuntiva alle barre già esistenti in un percorso?

Ho notato che C # aggiunge ulteriori barre ( \ ) ai percorsi. Considera il percorso C:\Test . Quando ispeziono la stringa con questo percorso nel visualizzatore di testo, la stringa effettiva è C:\\Test .

Perchè è questo? Mi confonde, perché a volte vorrei dividere il percorso (usando string.Split() ), ma mi chiedo quale stringa usare (una o due barre).

.Net non aggiunge nulla alla tua stringa qui. Ciò che vedete è un effetto di come il debugger sceglie di visualizzare le stringhe. Le stringhe C # possono essere rappresentate in 2 forms

  • Stringhe Verbatim: prefissato con un segno @ e rimuove la necessità di escape \\ caratteri
  • Stringhe normali: stringhe in stile C standard in cui \\ caratteri devono sfuggire a se stessi

Il debugger mostrerà una stringa letterale come una stringa normale rispetto a una stringa letterale. È solo un problema di visualizzazione, ma non influisce sul valore sottostante.

\\ è usato perché \ è un carattere di escape ed è necessario rappresentare il singolo \ .

Quindi sta dicendo trattare il primo \ come carattere di escape e quindi il secondo \ viene preso come valore effettivo. Se non il prossimo carattere dopo il primo \ verrebbe analizzato come carattere di escape.

Ecco un elenco di caratteri di escape disponibili:

 \' - single quote, needed for character literals \" - double quote, needed for string literals \\ - backslash \0 – Null \a - Alert \b - Backspace \f - Form feed \n - New line \r - Carriage return \t - Horizontal tab \v - Vertical quote \u - Unicode escape sequence for character \U - Unicode escape sequence for surrogate pairs. \x - Unicode escape sequence similar to "\u" except with variable length. 

EDIT: Per rispondere alla tua domanda riguardante Split , non dovrebbe esserci alcun problema. Usa Split come faresti normalmente. \\ sarà trattato come unico carattere di \ .

I visualizzatori di debug visualizzano le stringhe nella forma in cui appaiono nel codice C #. Poiché \ è utilizzato per sfuggire ai caratteri nelle stringhe C # non verbali, \\ è il modulo di escape corretto.

Ok, quindi le risposte di cui sopra non sono del tutto corrette. Come tale sto aggiungendo i miei risultati per la prossima persona che legge questo post.

Non puoi dividere una stringa usando uno qualsiasi dei caratteri nella tabella sopra se stai leggendo le stringhe da una fonte esterna.

vale a dire,

 string[] splitStrings = File.ReadAllText([path]).Split((char)7); 

non sarà diviso da quei caratteri. Tuttavia le stringhe create internamente funzionano bene.

vale a dire,

 string[] splitStrings = "hello\agoodbye".Split((char)7); 

Questo potrebbe non essere vero per altri metodi di lettura del testo da un file. Non sono sicuro in quanto non ho provato con altri metodi. Con questo in mente, è probabilmente meglio non usare quei caratteri per delimitare le stringhe!