外部和静态的顺序是否重要?

时间:2013-04-17 18:51:07

标签: c# static-methods .net-1.0

比较两个文件(旧文件和新文件),我看到:

private extern static void SipShowIM(uint dwFlag);

...在旧文件中,并且:

private static extern void SipShowIM(uint dwFlag);

...在新文件中。

为什么他们改变了我不知道;首先出现的是外部还是静止的?

更新

Resharper一定是这样做的,因为我知道我没有这样做(直接),但这里是旧的另一个区别:

public volatile static bool ProcessCommands = true;

......和新:

public static volatile bool ProcessCommands = true;

4 个答案:

答案 0 :(得分:2)

不,这些关键字的顺序无关紧要。

答案 1 :(得分:2)

好吧,我不相信这两种用法有区别。我只考虑 MSDN 页面的代码,我尝试了两种方式(extern staticstatic extern),两个代码生成相同的IL代码。

.method public hidebysig static int32  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       41 (0x29)
  .maxstack  4
  .locals init ([0] string myString,
           [1] int32 CS$1$0000)
  IL_0000:  nop
  IL_0001:  ldstr      "Enter your message: "
  IL_0006:  call       void [mscorlib]System.Console::Write(string)
  IL_000b:  nop
  IL_000c:  call       string [mscorlib]System.Console::ReadLine()
  IL_0011:  stloc.0
  IL_0012:  ldc.i4.0
  IL_0013:  call       native int [mscorlib]System.IntPtr::op_Explicit(int32)
  IL_0018:  ldloc.0
  IL_0019:  ldstr      "My Message Box"
  IL_001e:  ldc.i4.0
  IL_001f:  call       int32 ProgramConsole.Program::MessageBox(native int,
                                                                string,
                                                                string,
                                                                int32)
  IL_0024:  stloc.1
  IL_0025:  br.s       IL_0027
  IL_0027:  ldloc.1
  IL_0028:  ret
} // end of method Program::Main

所以,我的钱是 NO

答案 2 :(得分:2)

不,根据C#规范,所有方法修饰符排序都是等效的。版本4.0,第B.2.7节,第493页:

  

方法改性剂:
  方法改性剂
  method-modifiers方法修饰符

     

方法改性剂:
  新
  公共
  保护
  内部
  私人
  静态
  虚拟
  密封
  覆盖
  抽象
  外部

这显然不是静态构造函数,但是在第497页(仍然是B.2.7节)中,两个命令都被明确地调出:

  

静态构造改性剂:
  extern opt static
  static extern opt

答案 3 :(得分:1)

方法修饰符的顺序无关紧要。然而,它通常写为static extern

StyleCop等工具抱怨:SA1206: The 'static' keyword must come before the 'other' keyword in the element declaration. 这只是编码风格的问题。