c# - Visual Studio 2015 封装字段

标签 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;
    }
}

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

最佳答案

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

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

土耳其人 imost common examples 之一用于展示文化之间的差异,如I是 `ý 的大写。例如检查 Writing Culture-Safe Managed Code MSDN 中的文章。

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

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

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);

更新

opened an issue在罗斯林网站上。

更新 2

不幸的是,这个问题被关闭为“按设计”。似乎关闭它的人将用户的区域设置与编写文本时使用的语言混淆了

关于c# - Visual Studio 2015 封装字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32825792/

相关文章:

.net - 使用 oracle.dataaccess.dll 时出错

visual-studio - 工作区和(连接到服务器)解决方案有什么区别?

c# - 在 C# 中使用 CsvHelper 写入文件

c# - 具有泛型和 DI 的存储库模式

c# - 在 C# 中是否有等效于 Python 的 ImportError

c++ - 给定一个带有 UnhandledExceptionFilter 的调用堆栈,导致我的应用程序崩溃的异常是什么?

c - Malloc 是否分配了比需要的更多的内存?

c# - 十进制转字符串问题

.net - 处置或不处置 (CA2000)

c# - 什么样的内存语义支配 C# 中的数组赋值?