c# – 无论如何都可以创建一个公共静态构造函数吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 无论如何都可以创建一个公共静态构造函数吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1768字,纯文字阅读大概需要3分钟。
内容图文
在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 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
(见公众?)
现在
ilasm test.il
test.exe
输出:
Static constructor: IsPublic: True, IsPrivate: False
Static constructor: IsPublic: True, IsPrivate: False
静态构造函数已执行两次:您对.cctor的调用以及CLR对.cctor执行的自动调用.只有在CLR调用静态构造函数时才会检查静态构造函数只运行一次,而不是在手动调用它时!
内容总结
以上是互联网集市为您收集整理的c# – 无论如何都可以创建一个公共静态构造函数吗?全部内容,希望文章能够帮你解决c# – 无论如何都可以创建一个公共静态构造函数吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。