【问题标题】:C#: string concatenation not workingC#:字符串连接不起作用
【发布时间】:2013-01-05 11:35:13
【问题描述】:

今天我遇到了一个以前从未遇到过的问题。我正在尝试从 Windows 注册表中的值检查文件是否存在。更具体地说,我从 Flight Simulator 获取安装路径并检查是否安装了模块。

我得到注册表键就好了,它被转换为一个字符串(从一个对象),但我似乎无法在它之后连接文件名(之前很好)。

RegistryKey pRegKey = Registry.CurrentUser;
pRegKey = pRegKey.OpenSubKey(@"Software\Microsoft\Microsoft Games\Flight Simulator\10.0");
string fSPath = pRegKey.GetValue("AppPath").ToString(); // Receives "S:/Apps/FSX/"

如果我显示这样的消息框,它不会连接:

MessageBox.Show(fSPath + "Modules");

【问题讨论】:

  • 作为记录,我尝试使用 StringBuilder 并显式转换两个文本部分。
  • 缺少的部分是“你会得到什么”。它不连接,但它有什么作用?消息框中显示什么?
  • 你确定你得到了正确的fSPath 值吗?你有没有逐行调试你的代码。
  • 我的猜测是,在 pRegKey 的末尾有一个 '\0' 字符。
  • @CSharpie - 所以? C#/.NET 字符串不是 C 字符串(无空终止符)。

标签: c# string concatenation


【解决方案1】:

尝试GetValue的其他重载方法:

GetValue Method (String, Object)
GetValue Method (String, Object, RegistryValueOptions)

并使用RegistryKey.GetValueKind方法获取与指定名称关联的值的注册表数据类型。

我们有three registry data types 用于字符串:

String 以 null 结尾的字符串。此值等效于 Win32 API 注册表数据类型 REG_SZ

ExpandString 一个以 null 结尾的字符串,其中包含对环境变量(例如 %PATH%)的未扩展引用,在检索值时会扩展这些引用。此值等效于Win32 API 注册表数据类型REG_EXPAND_SZ

MultiString 以空字符结尾的字符串数组,以两个空字符结尾。此值等效于Win32 API 注册表数据类型REG_MULTI_SZ

【讨论】:

    【解决方案2】:

    添加以下行:

    string fSPath = fsPath.Replace("\0","");
    

    在使用消息框之前。

    【讨论】:

    • 做到了!哇谢谢!这个\0怎么有却不显示?
    • RegistryKey 是一个相当古老的类。我不知道它是用哪种语言编写的,可能是 c 或 c++。这些语言使用 \0 来判断字符串的结尾在哪里。而且由于它标志着结束,因此不会显示。
    • 可能想改用 Registry 类。
    • 注册表也是如此。我也需要删除 \0。
    猜你喜欢
    • 2018-09-03
    • 2021-01-26
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 2013-11-04
    • 1970-01-01
    相关资源
    最近更新 更多