【问题标题】:Visual Studio 2015 Encapsulate FieldVisual Studio 2015 封装字段
【发布时间】:2015-09-28 14:43:08
【问题描述】:

在 Visual Studio 2013 中,当我封装一个以 i 字母开头的字段时。它生成一个以I

开头的属性
int inside = 0;

public int Inside
{
    get { return inside; }
    set { inside = value; }
}

但在 Visual Studio 2015 中,如果我封装相同的字段,它会生成一个以 İ 字母开头的属性。应用一些缩进规则并在 get 和 set 修饰符之间添加一个空格

int inside = 0;

public int İnside
{
    get
    {
        return inside;
    }

    set
    {
        inside = value;
    }
}

如何改变这种行为?如果相关且系统文化是土耳其语,我正在使用土耳其语键盘

【问题讨论】:

    标签: c# .net visual-studio unicode


    【解决方案1】:

    你打错了土耳其语 i,而不是英语 i。

    这似乎是重构代码的调试,在将第一个字母转换为大写时,它没有以安全的方式处理用户的文化。

    土耳其语i 是用于展示文化差异的most common examples 之一,因为I 是`ý 的大写。例如查看 MSDN 中的 Writing Culture-Safe Managed Code 文章。

    当您想输入拉丁变量名称时,请确保您已将键盘切换为英语。

    正如 OP 评论的那样,结果不受键盘语言的影响,而是受用户的语言环境影响。这意味着负责封装字段的 Roslyn 重构使用当前 CultureInfo 而不是不变的执行 ToUpper 调用。

    Roslyn 重构以开源形式提供,因此很容易找到相关代码。在AbstractEncapsulateFieldService.cs 中,GeneratePropertyName 方法调用char.ToUpper 而不指定文化:

    return char.ToUpper(baseName[0]).ToString() + baseName.Substring(1);
    

    这应该很容易改成:

    return char.ToUpper(baseName[0],CultureInfo.InvariantCulture).ToString() 
          + baseName.Substring(1);
    

    更新

    我在 Roslyn 网站上opened an issue

    更新 2

    很遗憾,该问题已作为“按设计”关闭。似乎关闭它的人将用户的区域设置与编写文本时使用的语言混淆了

    【讨论】:

    • 感谢您的回答。键盘似乎不是问题,而是区域设置。如果我将区域设置从“控制面板 > 区域和语言 > 格式”更改为英语,它似乎可以按预期工作。我相信 2015 使用的是系统区域设置,而 2013 不是。
    • 如果您使用美式键盘和土耳其语格式,也会发生同样的事情吗?
    • 是的键盘设置不会改变任何东西
    • 听起来他们添加了一个任何程序员都会认为是错误的“功能”。 Roslyn 中的重构是由 Roslyn 执行的,所以问题很可能是在那里引入的 - 没有指定 InvariantCulture 执行案例更改
    • 具体来说,in this line char.ToUpper 在没有指定文化的情况下被调用
    猜你喜欢
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 2016-11-17
    • 1970-01-01
    相关资源
    最近更新 更多