为什么 C# 中不调用所有静态构造函数(即父类的静态构造函数)?

2023-11-25

我有三节课,Base, Derived and Final. Derived源自于Base and Final源自于Derived。所有三个类都有一个静态构造函数。班级Derived作为一个名为的公共静态方法Setup。当我打电话时Final.Setup,我希望所有三个静态构造函数都会被执行,但只有其中的一个Derived运行。

这是示例源代码:

    abstract class Base
    {
        static Base()
        {
            System.Console.WriteLine ("Base");
        }
    }

    abstract class Derived : Base
    {
        static Derived()
        {
            System.Console.WriteLine ("Derived");
        }

        public static void Setup()
        {
            System.Console.WriteLine ("Setup");
        }
    }

    sealed class Final : Derived
    {
        static Final()
        {
            System.Console.WriteLine ("Final");
        }
    }

这对我来说只有部分意义。我明白那个呼唤Final.Setup()实际上只是一个别名Derived.Setup(),所以跳过静态构造函数Final看起来很公平。但是,为什么不是静态构造函数Base called?

我可以通过调用一个无操作静态方法来解决这个问题Base或者通过访问一些虚拟静态方法Base。但我想知道:这种明显奇怪的行为背后的原因是什么?


当(根据TCPL):

  • 创建类类型的实例。
  • 类类型的任何静态成员都会被引用。

举个例子,考虑一个带有 static 的类Main开始执行的方法:如果你有一个静态构造函数,它将被调用before调用 Main 方法。

请注意,即使在执行静态构造函数之前,所有静态字段也会被初始化为其默认值,然后为这些字段执行静态字段初始值设定项。只有这样,静态构造函数(cctor)才会被执行。


更直接地回答你的问题:静态构造函数不是继承的,并且不能直接调用它们,因此你的Basecctor 在您的场景中不会被调用,除非您给出摘要Base类静态方法并首先调用它,即如Base.Initialize(),正如您已经建议的那样。

关于推理,这很简单,思考 C#(在 Java 中这是不同的):静态方法不被继承,因此静态构造函数也不应该被继承,因为这可能会导致不需要的副作用(当没有任何内容引用该类时调用的 cctor)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 C# 中不调用所有静态构造函数(即父类的静态构造函数)? 的相关文章

  • 双缓冲列表框

    我有一个 CheckedListBox WinForms 控件 它继承自 ListBox 谷歌搜索显示问题出在 ListBox 该控件锚定到其窗体的所有四个边 当调整表单大小时 列表框会出现难看的闪烁 我尝试继承 CheckedListBo
  • 以编程方式在网格视图列上显示数据

    我有一个产品数量列表和一个网格视图 网格视图已经绑定到一些数据 但我想在网格视图的第三列显示产品数量列表 以下是如何将数据绑定到网格视图的代码 gvProduct DataSource distSPUItem gvProduct DataB
  • 带有 Windows 窗体应用程序的地图

    我正在构建一个需要地图的 C Winforms 应用程序 例如 Google 地图 Bing 地图等 但我对 ToU 许可 非商业使用等感到非常困惑 我的问题 您建议将哪个地图提供商 最好是免费的 嵌入到 winforms 应用程序中以用于
  • 类变量在其定义范围内?

    这可能是一个愚蠢的问题 我正在尝试制作文本泥 我需要每个 Room 类包含其他 Room 类 以便在尝试移动到它们或从它们获取信息时可以引用 但是 我不能这样做 因为我显然无法在其定义中声明一个类 那么 我该怎么做呢 当我说我做不到时 我的
  • ctypes.ArgumentError:不知道如何转换参数

    我在C库中定义了一个函数 如下所示 int Test char str1 int id1 char str2 float val float ls 我想在Python中使用它 所以我编写了以下Python代码 str1 a str2 b i
  • iPhone 编程游戏

    使用 Objective C 还是 C 为 iPhone 编写游戏最好 像 Flight Control 这样的游戏会用什么语言编写 图形应采用什么格式才能在 iPhone 上正确显示并快速加载 像 Flight Control 这样的游戏
  • C# 从整数反序列化枚举

    是否可以从 C 中的 int 反序列化枚举 例如如果我有以下课程 class Employee public string Name get set public int EmployeeTypeID get set 我可以轻松地从 XML
  • 如何使用 Regsvr32 注册 .NET COM DLL?

    我有一个使用 COM DLL 的 VB6 应用程序 该DLL是用C 编写的 在 C 项目属性中 我检查了 Register for COM interop 选项 VB6 应用程序在我的开发机器上运行良好 C 代码完全遵循以下格式 CodeP
  • 驱蚊程序?

    不 我认真的 最近 我读到 当电脑的压电蜂鸣器以一定频率振动时 声音可以驱赶蚊子 真的吗 如何以编程方式访问 PC 蜂鸣器 而不是扬声器 最好使用 C 我不知道有没有蚊子 但我的头疼得要命 啊啊 using System Runtime I
  • WPF 中可选择的 TextBlock 或带有格式化文本的 TextBox

    我遇到一种情况 我需要显示格式化文本 正常 粗体 突出显示 并且还应该是可选择的 以便用户可以复制文本 我使用了文本块 我可以使用内联内容流元素应用多种格式 但不幸的是它的文本不可选择 虽然文本框允许选择文本并复制到剪贴板 但它不允许我设置
  • 从动态服务器中抓取 html 列表数据

    哈喽大家好 抱歉提出转储问题 这是我最后的手段 我发誓我尝试了无数其他 Stackoverflow 问题 不同的框架等 但这些似乎没有帮助 我有以下问题 一个网站显示一个数据列表 前面有大量的 div li span 等标签 它是一个很大的
  • 给出对象的指针作为参数

    假设我有 void func foo obj 我有 foo object 我该如何制作object进入争论func 只需取消引用它即可 func object
  • 在浏览器中测试wcf服务

    我无法在浏览器中调用基本的 wcf web 方法 即使使用
  • 有没有办法对 RichTextBox 的撤消历史进行分组或暂时禁用它?

    我目前正在研究 WPF 中 RichTextBox 内的表格 在 WPF 中 表格没有行和列 只有行 每行都有一定数量的单元格 当用户按下 添加列 按钮时 我的程序会向每一行添加一个新单元格 使用此方法的问题是 在用户添加一列后 如果他们按
  • 如何在 ASP.NET MVC 中获取参数数组作为 GET / POST?

    如何最好地获取数组 item gt value 对作为 GET POST 参数 在 PHP 中 我可以这样做 网址 这得到的参数为 Array a gt Array one gt 100 two gt 200 有什么方法可以在 ASP NE
  • 为什么泛型 IList<> 不继承非泛型 IList

    IList
  • ASP.NET Core中间件如何进行DI?

    我正在尝试将依赖项注入到我的中间件构造函数中 如下所示 public class CreateCompanyMiddleware private readonly RequestDelegate next private readonly
  • 实例着色器矩阵的设置

    我想绘制实例立方体 我可以打电话GL DrawArraysInstanced PrimitiveType Triangles 0 36 2 成功地 我的问题是所有立方体都绘制在相同的位置和相同的旋转 我如何为每个立方体单独更改它 要创建不同
  • 为 winforms ComboBox 中的单个项目着色?

    我遇到了一个困境 我有一个表单 其中包含许多组合框 其中包含在某些情况下可能无效 过时的信息 选项 项目 我不能简单地从项目中删除过时的信息 但我确实想在选项无效时为用户提供视觉线索 我正在考虑对项目进行着色 可能是红色 来指示它们是否无效
  • In 和 Out 属性在 .NET 中如何工作?

    我一直在尝试跨序列化数组AppDomain边界 使用以下代码 public int Read byte buffer int offset int count return base Read buffer offset count 作为猜

随机推荐

  • Google 地图 API:标记图像定位

    我已经更改了用于marker在谷歌地图上 新图像比旧图像宽得多 我注意到标记与旧图像对齐lat and lng以便标记位于其水平中点上方lat and lng 这不是我想要的 我想要的是lat and lng与左侧的标记对齐 我想偏移mar
  • “溢出”编译器错误 -9223372036854775808L

    的范围长数据类型 is 9223372036854775808 to 9223372036854775807 但以下语句会生成编译器错误 BC30036 溢出 Dim a As Long 9223372036854775808L 在线尝试一
  • HTML/CSS - 为什么打印时背景颜色变成白色?

    打印时 我的背景颜色甚至元素的字体颜色突然变成白色 这是一个示例标记 div div
  • Crystal Report(或 SSRS)在图像周围流动文本

    我想在水晶报表中有这样的布局 我怎样才能做到这一点 如果无法在 CR 或 SSRS 中完成 是否还有其他替代方案 我不相信水晶报表可以做到这一点 我对 SSRS 不太熟悉 但在查看了现场选项后 我也不相信它可以用它来完成 通常 现场位置在报
  • 实体框架批量插入抛出 KeyNotFoundException 错误

    我在用EF6并且由于速度低AddRange 我需要使用的方法BulkInsert 所以我通过以下方式添加了 BulkInsert for EF6 的 NuGet 包here 添加后我收到的第一件事dll是这个警告 发现同一依赖的不同版本之间
  • Apache POI 公式未计算

    因此 我在让 Apache POI 评估公式时遇到一些问题 这是我在编写之前调用的用于评估公式的代码 complete getCreationHelper createFormulaEvaluator evaluateAll complet
  • Woocommerce - 产品价格取决于国家/地区

    我有 2 个关于 Woocommerce for Wordpress 的问题 我正在开发一个向丹麦市场销售扬声器的网站 问题一 我可以检测访客的IP并检测该人来自哪个国家吗 我想这可以通过一些 ClientLocation api 来完成
  • 使用 Javascript 从输入中删除 :valid 伪类

    我有一个包含多个部分的表格 每个部分均使用 Bootstrap 4 验证手动验证 无需实际提交表单 这与下面的代码配合得很好 let eventCreationForm event creation form if eventCreatio
  • Azure AD B2C - 角色管理[重复]

    这个问题在这里已经有答案了 我有一个与 Azure AD B2C 连接的 Asp NET MVC 应用程序 在管理员设置中 我创建了一个管理员组 在我的代码中我想使用 Authorize Roles Administrator 使用常规 A
  • 图问题:在 SQL Server 中通过 NOCYCLE 先前替换进行连接?

    问题 I have the following directed graph 还有这张表 CREATE TABLE dbo T Hops UID uniqueidentifier NULL From nvarchar 1000 NULL T
  • javascript regexp 用于 00-59(秒)之间的数字

    我想检查某个字段是否是有效的时间值 仅秒 所以我想接受从 0 到 59 的数字 我得出了这个 0 5 0 9 这几乎可以完成工作 但排除数字 7 8 9 如果用户数字 07 它就可以工作 但我不想强迫用户数字第一个 0 所以我尝试了这样的操
  • Google Maps API v3:如何将缩放级别和地图中心设置为用户提交的位置?

    我已经使用 Google 的本教程构建了一个网络应用程序 该应用程序可以从用户输入的位置找到最近的商店 http code google com apis maps articles phpsqlsearch v3 html 我的应用程序几
  • 使用 Beautiful Soup 抓取多个 URL

    我正在尝试从多个 URL 中提取特定的类 标签和类保持不变 但我需要我的 python 程序在我输入链接时抓取所有内容 这是我的工作示例 from bs4 import BeautifulSoup import requests impor
  • Doctrine2 ORM 不会刷新在脚本之外更改的对象

    我真的不知道如何给这个标题或搜索一个已经发布的问题 所以如果以前在这里见过这个问题 我深表歉意 我使用以下代码得到了一些不需要的结果 get object managers fooManager this gt getContainer g
  • Uint8Array JavaScript 用例

    我刚刚发现 Javascript 通过以下方式输入了数组this关联 我立刻很好奇这些对象对语言有什么好处 我注意到 UInt8Arrays 丢失了 map 类型函数 我将拥有普通数组对象 所以如果你想循环它们 你将需要一个for loop
  • 如何使用环境路径查找可能不完全限定的文件?

    我有一个可执行文件名称 例如cmd exe并需要解决其完全限定路径 我知道该 exe 出现在列出的目录之一中PATH环境变量 有没有一种方法可以解析完整路径 而无需解析和测试中的每个目录PATH多变的 基本上我不想这样做 foreach s
  • 如何在PHP中限制文件上传类型的文件大小?

    我有一个上传表单 正在检查文件大小和文件类型 以将上传的文件限制为 2 MB 文件类型为 pdf jpg gif 或 png 我的目标是 如果用户违反这些规则之一 则向他们显示一条警报消息 有四种情况 正确尺寸 正确类型 工作 正确尺寸 错
  • 带硬件加速的画布抗锯齿(Android API 11 及更高版本)

    我有一个简单的位图 我在画布中绘制并使用矩阵旋转 我遇到的问题是 使用硬件加速时 边缘在旋转时不会消除锯齿 这在关闭硬件加速的情况下完美运行 当然 像 setDrawFilter 这样的东西是没有用的 因为当硬件加速打开时它们会被忽略 ca
  • javascript中如何在不同html页面之间传递变量值

    我想传递选择的值项目清单到另一个页面 意味着如果我从列表中选择 abc 那么这个 abc 值会传递到下一个 html 表单 它应该只打开该配置文件页面 有什么方法可以在不同的 html 页面之间使用此变量 ui li icon li cli
  • 为什么 C# 中不调用所有静态构造函数(即父类的静态构造函数)?

    我有三节课 Base Derived and Final Derived源自于Base and Final源自于Derived 所有三个类都有一个静态构造函数 班级Derived作为一个名为的公共静态方法Setup 当我打电话时Final