Visual Studio 2015封装字段

时间:2015-09-28 14:43:08

标签: c# .net visual-studio unicode

在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;
    }
}

如何更改此行为?我使用土耳其语键盘,如果它是相关的,系统文化是土耳其语

1 个答案:

答案 0 :(得分:1)

您错误地键入了土耳其语i,而不是英语i。

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

土耳其语imost 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

不幸的是,该问题已被关闭为“按设计”。看来,关闭它的人会混淆用户的语言环境设置与编写文本时使用的语言