如果我使用多个,我应该使用修饰符关键字,例如:
public
,private
,protected
,virtual
,abstract
,override
,new
,static
,internal
,sealed
,以及我忘记的任何其他人。
答案 0 :(得分:19)
如果您下载Microsoft StyleCop Visual Studio插件,它可以根据Microsoft使用的某些团队的规则验证您的源代码。它首先使用访问修饰符。
编辑:微软本身并不完全一致;不同的团队使用不同的风格例如。 StyleCop建议在命名空间中使用指令;但是在Roslyn源代码中没有遵循这一点。答案 1 :(得分:15)
我查看了Microsoft的Framework Design Guidelines,但找不到任何关于应该在成员上添加订单修饰符的引用。同样地,C# 5.0 language specification看起来毫无结果。不过还有其他两种途径:EditorConfig files和ReSharper。
MSDN页面.NET coding convention settings for EditorConfig说:
在Visual Studio 2017中,您可以使用EditorConfig文件在代码库中定义和维护一致的代码样式。
示例EditorConfig文件
为了帮助您入门,下面是一个带有默认选项的示例.editorconfig文件:
############################### # C# Code Style Rules # ############################### # Modifier preferences csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion
换句话说:修饰符的默认顺序,遵循默认的editorconfig设置:
{ public / private / protected / internal / protected internal / private protected } // access modifiers
static
extern
new
{ virtual / abstract / override / sealed override } // inheritance modifiers
readonly
unsafe
volatile
async
ReSharper更为明确。 ReSharper 2018.1 1 的默认值,包含访问修饰符(它们是独占的)和继承修饰符(它们是独占的),组合在一起是:
{ public / protected / internal / private / protected internal / private protected } // access modifiers
new
{ abstract / virtual / override / sealed override } // inheritance modifiers
static
readonly
extern
unsafe
volatile
async
这存储在
下的{solution}.dotsettings
文件中
"/Default/CodeStyle/CodeFormatting/CSharpFormat/MODIFIERS_ORDER/@EntryValue"
节点 - ReSharper默认 2 是:
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/MODIFIERS_ORDER/@EntryValue">
public protected internal private new abstract virtual sealed override static readonly extern unsafe volatile async
</s:String>
1 ReSharper 2018.1表示它“完全理解C#7.2 ”并明确提及private protected
访问修饰符。
2 ReSharper仅保存与默认设置不同的设置,因此通常不会在dotsettings
文件中看到此节点。
new static
vs static new
Compiler Warning CS0108的MSDN页面给出了派生类上公共静态字段i
隐藏的基类上的公共字段i
的示例:他们的建议是更改static
到static new
:
public class clx { public int i = 1; } public class cly : clx { public static int i = 2; // CS0108, use the new keyword // Use the following line instead: // public static new int i = 2; }
同样,Visual Studio 2015中的IntelliSense也建议将static
更改为static new
如果基类中的字段i
也是static
,则相同。
也就是说,粗略搜索GitHub发现有些项目覆盖了此默认设置,在之前放置static
,而在 new
之后放置继承修饰符和sealed
,例如
the ReSharper settings for StyleCop GitHub project:
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/MODIFIERS_ORDER/@EntryValue">
public protected internal private static new abstract virtual override sealed readonly extern unsafe volatile async
</s:String>
但是由于static
不能与继承修饰符或sealed
一起使用,这只是new static
(默认的,默认的editorconfig文件建议)和static new
之间的区别。 (in 2015) (in 2018)
new static 203 427
static new 10 990
(ReSharper建议)。
我个人更喜欢后者,但Google在2015年和2018年在referencesource.microsoft.com中搜索了new static
与static new
的对比:
static new
表示Microsoft的首选项为Font from origin 'https://locohop.com' has been blocked from loading by
Cross-Origin Resource Sharing policy: No 'Access-Control-Allow-Origin'
header is present on the requested resource. Origin 'http://locohop.com'
is therefore not allowed access.
。
答案 2 :(得分:3)
我通常首先使用访问修饰符,然后是虚拟/抽象/密封,然后覆盖/ new / etc。虽然其他人可能会有不同的做法然而,几乎无一例外,访问修饰符将是第一个。
答案 3 :(得分:1)
在某些情况下,有很多可能性。例如,下面的类C
具有基类B
,
public class B
{
public void X()
{
}
}
public class C : B
{
protected internal new static readonly DateTime X;
}
DateTime
中C
类型的字段包含不少于五个不同的修饰符,因此有5! == 5*4*3*2*1 == 120
种不同的方式来编写相同的字段! 非常会让protected
和internal
彼此相邻,但它仍然是合法的。
不确定每个人是否同意订单的约定。例如,我看到有些人在访问级别(保护级别)修饰符之前放置了new
修饰符,尽管许多人喜欢始终首先使用保护级别修饰符。