C#中修饰符的顺序是否有约定?

时间:2008-10-10 15:40:00

标签: c#

如果我使用多个,我应该使用修饰符关键字,例如:

publicprivateprotectedvirtualabstractoverridenewstaticinternalsealed,以及我忘记的任何其他人。

4 个答案:

答案 0 :(得分:19)

如果您下载Microsoft StyleCop Visual Studio插件,它可以根据Microsoft使用的某些团队的规则验证您的源代码。它首先使用访问修饰符。

编辑:微软本身并不完全一致;不同的团队使用不同的风格例如。 StyleCop建议在命名空间中使用指令;但是在Roslyn源代码中没有遵循这一点。

答案 1 :(得分:15)

我查看了Microsoft的Framework Design Guidelines,但找不到任何关于应该在成员上添加订单修饰符的引用。同样地,C# 5.0 language specification看起来毫无结果。不过还有其他两种途径:EditorConfig filesReSharper

.editorconfig

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更为明确。 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的示例:他们的建议是更改staticstatic 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

CS0108 Visual Studio recommended change

如果基类中的字段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 staticstatic 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;
}

DateTimeC类型的字段包含不少于五个不同的修饰符,因此有5! == 5*4*3*2*1 == 120种不同的方式来编写相同的字段! 非常会让protectedinternal彼此相邻,但它仍然是合法的。

不确定每个人是否同意订单的约定。例如,我看到有些人在访问级别(保护级别)修饰符之前放置了new修饰符,尽管许多人喜欢始终首先使用保护级别修饰符。