为啥 .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 会在路径中已经存在的斜杠上添加一个额外的斜杠?的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET 图片上传为啥传上出去了 但是显示不出来 我用的ACCESS数据库 图片的路劲已经传到了数据库里,
为啥我的 ASP.NET 页面会在 html 元素 ID 中添加前缀“ctl00_ctl00”并破坏设计?