gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:19:06 26 4
gpt4 key购买 nike

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

enter image description here

更新:在链接中,它说“如果静态构造函数不是私有(private)的,它可以被系统以外的代码调用。”。这促使我提出这个问题。

最佳答案

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

public class Test
{
static Test()
{
}
}

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

请注意,从技术上讲,通过直接编写 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

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 调用静态构造函数时才会检查静态构造函数只运行一次,而不是在您手动调用它时! :-)

关于c# - 无论如何都可以创建一个公共(public)静态构造函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31025900/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com