为啥 .NET 会在路径中已经存在的斜杠上添加一个额外的斜杠?

Posted

技术标签:

【中文标题】为啥 .NET 会在路径中已经存在的斜杠上添加一个额外的斜杠?【英文标题】:Why does .NET add an additional slash to the already existent slashes in a path?为什么 .NET 会在路径中已经存在的斜杠上添加一个额外的斜杠? 【发布时间】:2011-07-24 20:50:15 【问题描述】:

我注意到 C# 在路径中添加了额外的斜杠 (\)。考虑路径C:\Test。当我在文本可视化器中使用此路径检查字符串时,实际字符串为C:\\Test

这是为什么?这让我很困惑,因为有时我可能想要拆分路径(使用string.Split()),但不得不想知道要使用哪个字符串(一个或两个斜杠)。

【问题讨论】:

杰弗里做对了。使用调试器窗口中的文本可视化工具。看起来像一个望远镜图标。点击它。 【参考方案1】:

之所以使用\\,是因为\是一个转义字符,需要表示单个\

也就是说,将第一个 \ 视为转义字符,然后将第二个 \ 视为实际值。如果不是第一个 \ 之后的下一个字符,则将被解析为转义字符。

以下是可用转义字符的列表:

\' - 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.

编辑:要回答您关于Split 的问题,应该没问题。像往常一样使用Split\\ 将被视为仅\ 的一个字符。

【讨论】:

【参考方案2】:

.Net 不会在此处向您的字符串添加任何内容。您看到的是调试器选择显示字符串的方式的影响。 C# 字符串可以用 2 种形式表示

逐字字符串:以@ 符号为前缀,无需转义\\ 字符 普通字符串:标准 C 样式字符串,其中 \\ 字符需要自行转义

调试器会将字符串文字显示为普通字符串与逐字字符串。不过这只是展示的问题,并不影响它的潜在价值。

【讨论】:

【参考方案3】:

调试器可视化工具以字符串在 C# 代码中出现的形式显示字符串。由于 \ 用于转义非逐字 C# 字符串中的字符,因此 \\ 是正确的转义形式。

【讨论】:

虽然是这种情况,但我不认为这就是调试器显示它的原因,它只需要一种能够显示控制字符的方法(就像 c# 需要一种解释它们的方法) @stefan - 是的,我无法推测为什么工具开发人员会做他们所做的任何事情。 @stefan:我认为这就是 Jeffrey 所说的 - 可视化工具显示字符串,就像它们在代码中一样,并且它们在代码中包含控制字符。 这是正确的。还要记住,它本来可以显示为@-string。我正在考虑将我的 +1 改为 -1 ;-)【参考方案4】:

好的,所以上面的答案并不完全正确。因此,我正在为下一个阅读这篇文章的人添加我的发现。

如果您从外部源读取所述字符串,则不能使用上表中的任何字符拆分字符串。

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

不会被这些字符分割。但是内部创建的字符串可以正常工作。

即,

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

这可能不适用于从文件中读取文本的其他方法。我不确定,因为我没有用其他方法测试过。考虑到这一点,最好不要使用这些字符来分隔字符串!

【讨论】:

以上是关于为啥 .NET 会在路径中已经存在的斜杠上添加一个额外的斜杠?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 .NET 运行时会在我的字符串中添加下划线?

ASP.NET 图片上传为啥传上出去了 但是显示不出来 我用的ACCESS数据库 图片的路劲已经传到了数据库里,

为啥我的 ASP.NET 页面会在 html 元素 ID 中添加前缀“ctl00_ctl00”并破坏设计?

为啥某些带有双反斜杠的路径抛出找不到路径异常的一部分?

为啥 Discord API 返回错误 405 以向公会添加斜杠命令?

VB.Net 2010中 ./和../的含义