VS 2017(可能还有更老的版本)给了我这个方便的小构造函数快捷方式来生成一个私有只读字段并分配它。

截图:

这最终会生成一个名为userService的私有成员,然后为它赋值:

this.userService = userService;

这违背了我使用的代码风格,即用前缀_命名所有私有成员,导致赋值看起来应该像这样:

_userService = userService;

我怎样才能让VS在它的代码生成快捷方式中遵守这个代码风格规则呢?


这可以通过创建自己的Roslyn代码分析器命名规则来实现。在解决方案中添加.editorconfig以指定自定义命名约定。

更多信息请访问:https://learn.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference

为了从这个问题中得到想要的效果,下面的方法是有效的:

[*.{cs,vb}]
dotnet_naming_rule.private_members_with_underscore.symbols  = private_fields
dotnet_naming_rule.private_members_with_underscore.style    = prefix_underscore
dotnet_naming_rule.private_members_with_underscore.severity = suggestion

dotnet_naming_symbols.private_fields.applicable_kinds           = field
dotnet_naming_symbols.private_fields.applicable_accessibilities = private
dotnet_naming_symbols.private_fields.required_modifiers         = readonly

dotnet_naming_style.prefix_underscore.capitalization = camel_case
dotnet_naming_style.prefix_underscore.required_prefix = _

结果:


.editorconfig设置是kspearrin的答案,对我不起作用,我必须使用这些(VS2017版本15.4.0):

[*.{cs,vb}]
dotnet_naming_rule.private_members_with_underscore.symbols  = private_fields
dotnet_naming_rule.private_members_with_underscore.style    = prefix_underscore
dotnet_naming_rule.private_members_with_underscore.severity = suggestion

dotnet_naming_symbols.private_fields.applicable_kinds           = field
dotnet_naming_symbols.private_fields.applicable_accessibilities = private

dotnet_naming_style.prefix_underscore.capitalization = camel_case
dotnet_naming_style.prefix_underscore.required_prefix = _

我从这里得到这些:https://github.com/dotnet/roslyn/issues/22884#issuecomment-358776444


这也可以直接在Visual Studio中实现。点击工具->选项->文本编辑器-> c# ->代码样式->命名。

首先,你需要通过点击“管理命名样式”按钮定义一个新的命名样式:

然后点击+号为“私有或内部字段”定义一个新规则,使用你的新命名风格:

重启Visual Studio 在此之后,当应用“Create and initialize field”重构时,它将以前导下划线命名。


我读了之前的解决方案,尽管它们看起来是正确的,但在VS2022中让配置正确工作的唯一方法是正确地排序.editorconfig条目,如下所示:

# Use underscores for private fields
[*.{cs,vb}]
dotnet_naming_symbols.private_fields.applicable_kinds           = field
dotnet_naming_symbols.private_fields.applicable_accessibilities = private

dotnet_naming_style.prefix_underscore.capitalization = camel_case
dotnet_naming_style.prefix_underscore.required_prefix = _

dotnet_naming_rule.private_fields_with_underscore.symbols  = private_fields
dotnet_naming_rule.private_fields_with_underscore.style    = prefix_underscore
dotnet_naming_rule.private_fields_with_underscore.severity = warning