Por que o .NET adiciona uma barra adicional às barras já existentes em um caminho?

Eu observei que C # adiciona barras adicionais ( \ ) aos caminhos. Considere o caminho C:\Test . Quando eu inspecionar a seqüência de caracteres com esse caminho no visualizador de texto, a seqüência real é C:\\Test .

Por que é isso? Isso me confunde, já que às vezes eu posso querer dividir o caminho (usando string.Split() ), mas tenho que me perguntar qual string usar (uma ou duas barras).

.Net não está adicionando nada à sua string aqui. O que você vê é um efeito de como o depurador escolhe exibir strings. Strings C # podem ser representadas em 2 formas

  • Strings Verbatim: Prefixado com um sinal @ e remove a necessidade de escape \\ caracteres
  • Strings normais: Strings de estilo C padrão onde \\ caracteres precisam escaping

O depurador exibirá uma string literal como uma string normal versus uma string textual. É apenas uma questão de exibição, mas não afeta seu valor subjacente.

O \\ é usado porque o \ é um caractere de escape e é necessário representar um \ único.

Por isso, está dizendo tratar o primeiro \ como um caractere de escape e, em seguida, o segundo \ é considerado como o valor real. Se não o próximo caractere após o primeiro \ seria analisado como um caractere de escape.

Aqui está uma lista de caracteres de escape disponíveis:

 \' - 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: Para responder à sua pergunta sobre Split , não deve ser problema. Use Split como você faria normalmente. O \\ será tratado como apenas o caractere de \ .

Os visualizadores do depurador exibem cadeias no formato em que elas apareceriam no código C #. Como \ é usado para escaping caracteres em strings C # não-verbatum, \\ é a forma correta de escape.

Ok, então as respostas acima não estão totalmente corretas. Como tal, estou adicionando minhas descobertas para a próxima pessoa que ler este post.

Você não pode dividir uma string usando qualquer um dos caracteres da tabela acima se estiver lendo a (s) string (s) de uma fonte externa.

ou seja,

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

não vai dividir por esses caracteres. No entanto, as strings criadas internamente funcionam bem.

ou seja,

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

Isso pode não ser válido para outros methods de leitura de texto de um arquivo. Não tenho certeza, pois não testei com outros methods. Com isso em mente, provavelmente é melhor não usar esses caracteres para delimitar strings!