是否有可能创建一个公共静态构造函数?

时间:2015-06-24 11:57:34

标签: c#

在Visual Studio 2012中,有一条规则说:Static constructors should be private,但编译器不允许这样做。那么无论如何我们可以创建公共静态构造函数吗?

enter image description here

在链接中

更新:,它说“如果静态构造函数不是私有的,则可以通过系统以外的代码调用它。”它让我想到了这个问题。

5 个答案:

答案 0 :(得分:6)

您必须省略public / private修饰符:

public class Test
{
    static Test()
    {
    }
}

实际上private静态构造函数的概念有点脆弱,因为静态构造函数只能由CLR(运行时)调用(并且可以调用)。所以private可能只是因为每个方法必须有一个修饰符,而不是因为它意味着什么(为了清楚说明:私有非静态构造函数可以由定义它的类调用,而静态构造函数不能由定义它的类直接调用)

请注意,从技术上讲,通过直接编写IL代码,您可以创建静态构造函数public ...然后您可以将其称为" normal"方法......和坏事发生 ......说清楚:

基础源代码:

using System;
using System.Linq;
using System.Reflection;

public class Program
{
    static void Main(string[] args)
    {
    }
}

public class Test
{
    static Test()
    {
        ConstructorInfo ci = typeof(Test).GetConstructors(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static).Single();
        Console.WriteLine("Static constructor: IsPublic: {0}, IsPrivate: {1}", ci.IsPublic, ci.IsPrivate);
    }
}

使用Visual Studio编译。

从开发人员命令提示符:

ildasm YourExe.exe /out:test.il

Main正文更改为

.entrypoint
// Code size       2 (0x2)
.maxstack  8
IL_0000:  nop

// we call manually the cctor (the static constructor)
call void Test::.cctor()
IL_0001:  ret

然后将Test.cctor签名更改为

.method public hidebysig specialname rtspecialname static           void .cctor()cil managed

(参见public?)

现在

ilasm test.il
test.exe

输出:

Static constructor: IsPublic: True, IsPrivate: False
Static constructor: IsPublic: True, IsPrivate: False

静态构造函数已执行两次:您对.cctor的调用以及CLR对.cctor执行的自动调用。只有在CLR调用静态构造函数时才会检查静态构造函数只运行一次,而不是在手动调用它时! : - )

答案 1 :(得分:3)

  

所以无论如何我们可以创建公共静态构造函数吗?

不,你不能,而且你不需要。静态构造函数不可调用,并且不像常规构造函数那样使用。它们在运行时内部用于初始化类的静态成员。

  

如果静态构造函数不是私有的,则可以通过其他代码调用它   比起系统。#34;它让我想到了这个问题。

不要忘记代码分析可用于C#以外的语言,其中静态构造函数可能是非私有的。因此,为什么存在此警告。在C#中,这种情况永远不会发生。

答案 2 :(得分:2)

静态构造函数没有访问修饰符。其他静态元素可以。

我们可以使用access modifier表示静态类,字段,属性和方法。但是如果你使用静态构造函数:

//Static class with Access Modifier
public class SomeClass
{
    //Static Field with Access Modifier
    public static int intstatic = 0;

    //Static Property with Access Modifier
    public static string StaticProperty { get; set; }

    //Trying to declare static Constructor with Access Modifier
    public static SomeClass()
    { }

    //Static Method with Access Modifier
    public static void DoSomething()
    {
        Console.WriteLine(intstatic);
    }
}

这将导致编译错误。

"静态构造函数"

上不允许访问修饰符

Haz,这对你有所帮助。通过它,它将清除你的基础。

http://www.codeproject.com/Articles/891433/Must-Remember-Key-Concepts-to-Keyword-Static

答案 3 :(得分:1)

不,您不能在C#或VB.NET中将静态构造函数设置为public或显式私有。

但是,您可以使用其他编程语言进行操作。

因此,规则就是强调这些问题。

对于C#和VB.NET,规则将无效,因为您无法破解它。

是否重要是有争议的,因为只有CLR才能调用静态构造函数,但这就是规则存在的原因。

答案 4 :(得分:1)

访问修饰符在静态上下文中没有意义。这是因为你不能直接调用它们,它们是由.NET Framework隐式调用的。

在第一次调用任何静态内容之前的某个时间点,保证静态构造函数将被执行

在实际操作中,您无法控制何时可能直接在您第一次访问静态成员之前。不过不要依赖这个。另外,请注意你的静态构造函数是否更改了它自己的类之外的任何状态,因为这可能意味着一些非常奇怪,无可指责的错误。