c# – 无论如何都可以创建一个公共静态构造函数吗?

c# – 无论如何都可以创建一个公共静态构造函数吗?,第1张

概述在Visual Studio 2012中有一条规则说: Static constructors should be private,但编译器不允许这样做.所以无论如何我们可以创建公共静态构造函数吗? 更新:在链接中,它说“如果静态构造函数不是私有的,它可以由系统以外的代码调用.”它让我想到了这个问题. 您必须省略public / private修饰符: public class Test{ 在Visual Studio 2012中有一条规则说: Static constructors should be private,但编译器不允许这样做.所以无论如何我们可以创建公共静态构造函数吗?

更新:在链接中,它说“如果静态构造函数不是私有的,它可以由系统以外的代码调用.”它让我想到了这个问题.

解决方法 您必须省略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# – 无论如何都可以创建一个公共静态构造函数吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/1223962.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存