在Visual Studio 2012中,有一条规则说:Static constructors should be private,但编译器不允许这样做。那么无论如何我们可以创建公共静态构造函数吗?
在链接中
更新:,它说“如果静态构造函数不是私有的,则可以通过系统以外的代码调用它。”它让我想到了这个问题。
答案 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隐式调用的。。
在第一次调用任何静态内容之前的某个时间点,保证静态构造函数将被执行。
在实际操作中,您无法控制何时可能直接在您第一次访问静态成员之前。不过不要依赖这个。另外,请注意你的静态构造函数是否更改了它自己的类之外的任何状态,因为这可能意味着一些非常奇怪,无可指责的错误。