更新:在链接中,它说“如果静态构造函数不是私有的,它可以由系统以外的代码调用.”它让我想到了这个问题.
解决方法 您必须省略public / private修饰符:public class Test{ static test() { }}
实际上,私有静态构造函数的概念有点脆弱,因为静态构造函数只能由CLR(运行时)调用(并且可以调用).因此私有存在可能只是因为每个方法都必须有一个修饰符,而不是因为它意味着任何东西(说清楚:私有非静态构造函数可以由定义它的类调用,而静态构造函数不能由定义它的类直接调用)
请注意,从技术上讲,通过直接编写IL代码,您可以将静态构造函数设置为public …然后您可以将其称为“正常”方法…并且发生了不好的事情……为了清楚起见:
基础源代码:
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
将主体更改为
.entrypoint// Code size 2 (0x2).maxstack 8IL_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
(见公众?)
现在
ilasm test.iltest.exe
输出:
Static constructor: IsPublic: True,IsPrivate: FalseStatic constructor: IsPublic: True,IsPrivate: False
静态构造函数已执行两次:您对.cctor的调用以及CLR对.cctor执行的自动调用.只有在CLR调用静态构造函数时才会检查静态构造函数只运行一次,而不是在手动调用它时! 总结
以上是内存溢出为你收集整理的c# – 无论如何都可以创建一个公共静态构造函数吗?全部内容,希望文章能够帮你解决c# – 无论如何都可以创建一个公共静态构造函数吗?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)