如何在实际需要 C# 静态类之前对其进行初始化?

2024-02-11

我有一个带有静态构造函数的静态类,需要一些时间(10-15 秒)来执行并完全初始化该类。为了提高性能,我决定让这个静态类显式初始化,而不是在第一次需要它时初始化,以便在实际需要使用时它就可以使用了。

我的第一个想法是创建一个Initialize()方法,但由于我已经有一个静态构造函数,因此该方法似乎不需要执行任何操作,只需调用显式初始化该类的方法,而无需访问其任何其他公共方法或属性。拥有一种不直接执行任何操作的方法对我来说似乎并不合适。

然后我想我可以将代码从静态构造函数移到这里Initialize()方法,但我也希望在第一次需要该类时对其进行初始化,并且Initialize()方法没有被显式调用。

总而言之,我希望遵守以下标准:

  • 我想允许显式初始化静态类(可能通过使用公共Initialize()方法)。
  • 当我不需要时,我不想访问类上的任何其他公共方法或属性,即使这会初始化静态类。
  • 如果该类尚未显式初始化,我仍然希望在第一次需要它时对其进行初始化(即,当访问其他公共方法或属性以使用它们提供的功能或数据时)。
  • 这是一个辅助类,对于我的目的而言,没有必要使用单例设计模式。

对于用 C# 编写的静态类,遵守上述标准的正确方法是什么?这也适用于其他编程语言(例如 Java),但我个人对用 C# 编写的解决方案感兴趣。


我会使用初始化方法(编辑:参见乔恩的答案)。但如果你really只是想使用构造函数,你可以这样做:

var type = typeof (YourType);
System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(type.TypeHandle);

RunClassConstructor http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.runtimehelpers.runclassconstructor.aspx允许您强制类构造函数(静态构造函数)运行(如果尚未运行)。如果它已经运行,比如说因为您使用了类的静态成员,那么这没有效果。额外运行几次没有效果。

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

如何在实际需要 C# 静态类之前对其进行初始化? 的相关文章

  • 扫描文本文件时如何跳过行?

    我想扫描一个文件并在阅读之前跳过一行文本 我试过 fscanf pointer n struct test i j 但这个语法只是从第一行开始 我可以使用 scanf 使用以下指令跳过行 fscanf config file n n 格式字
  • 检查列表是否包含另一个列表。 C#

    编辑 只是说 ContainsAllItem 中的注释解释得最好 很抱歉问这个问题 我知道以前有人问过这个问题 但我只是不明白 好的 所以我想检查一个列表是否包含另一个列表中的所有项目WITHOUT重叠 以及根据类字符串 名称变量 称为项目
  • Android NDK C++“wstring”支持

    我有用 C 编写的源代码 lib 现在我想在 Android NDK 项目 NDK 6 中编译并使用相同的源代码 lib 我能够编译大多数 C 文件 除了基于 std wstring 的功能 在 Application mk 中 当我指定时
  • 为什么派生类不使用基类的operator=(赋值运算符)?

    以下是实际问题的简化版本 而不是打电话Base operator int 代码似乎生成了一个临时的Derived对象并复制它 既然函数签名似乎完美匹配 为什么不使用基本赋值运算符 这个简化的示例没有显示任何不良影响 但原始代码在析构函数中有
  • 在 GCC 和 Clang 下,使用 lambda 的简单 RAII 包装器的复制初始化意外失败

    我在创建一个简单的 RAII 包装器时遇到了一个意想不到的问题 更不用说下面代码的逻辑不完整性了 复制构造函数和赋值运算符未删除等 这意味着是一个SSCCE 令我印象深刻的是复制初始化我的包装器与临时 lambda 的结果会导致编译错误 而
  • 如何在 Windows 窗体中运行屏幕保护程序作为其背景?

    如何在 Windows 窗体中运行屏幕保护程序作为其背景 用户还可以在屏幕保护程序运行时与表单控件进行交互 为什么这个 我们有一个案例 需要在用户时运行 Windows Bubbles 屏幕保护程序 可以继续与表单控件交互吗 您可以使用以下
  • 在通过网络发送之前压缩位图

    我正在尝试通过网络发送位图屏幕截图 因此我需要在发送之前对其进行压缩 有一个库或方法可以做到这一点吗 当您将图像保存到流时 您have选择一种格式 几乎所有位图格式 bmp gif jpg png 都使用一种或多种压缩形式 因此 只需选择适
  • 使用反射获取基类的受保护属性值

    I would like to know if it is possible to access the value of the ConfigurationId property which is located in the base
  • QThread - 使用槽 quit() 退出线程

    我想在线程完成运行时通知对象 但是 我无法让线程正确退出 我有以下代码 处理器 cpp thread new QThread tw new ThreadWorker connect tw SIGNAL updateStatus QStrin
  • 为什么重载方法在 ref 仅符合 CLS 方面有所不同

    公共语言规范对方法重载非常严格 仅允许根据其参数的数量和类型来重载方法 如果是泛型方法 则根据其泛型参数的数量进行重载 根据 csc 为什么此代码符合 CLS 无 CS3006 警告 using System assembly CLSCom
  • 为什么WCF中不允许方法重载?

    假设这是一个ServiceContract ServiceContract public interface MyService OperationContract int Sum int x int y OperationContract
  • 如何将字符串转换为 Indian Money 格式?

    我正在尝试将字符串转换为印度货币格式 例如如果输入为 1234567 则输出应为 12 34 567 我编写了以下代码 但它没有给出预期的输出 CultureInfo hindi new CultureInfo hi IN string t
  • 为什么C语言中可以使用多个分号?

    在 C 中我可以执行以下操作 int main printf HELLO WORLD 它有效 这是为什么 我个人的想法 分号是一个 NO OPERATION 来自维基百科 指示符 拥有一大串分号与拥有一个分号并告诉 C 语句已结束具有相同的
  • 将一个 long 转换为两个 int 以进行重构

    我需要将一个参数作为两个 int 参数传递给 Telerik Report 因为它不能接受长参数 将 long 拆分为两个 int 并在不丢失数据的情况下重建它的最简单方法是什么 使用掩蔽和移位是最好的选择 根据文档 long 保证为 64
  • 为什么 C# 接口名称前面加上“I”

    这种命名约定背后的基本原理是什么 我没有看到任何好处 额外的前缀只会污染 API 我的想法与康拉德一致response https stackoverflow com a 222502 9898与此相关的question https sta
  • 如何强制执行特定的 UserControl 设计

    我正在编写一个基本用户控件 它将由一堆其他用户控件继承 我需要对所有这些后代控件强制执行某种设计 例如 顶部必须有几个按钮以及一个或两个标签 后代用户控件区域的其余部分可以自由放置任何内容 最初 我认为我可以将一个面板放到 Base Use
  • 通过 cmake 链接作为外部项目包含的 opencv 库[重复]

    这个问题在这里已经有答案了 我对 cmake 比较陌生 经过几天的努力无法弄清楚以下事情 我有一个依赖于 opencv 的项目 它本身就是一个 cmake 项目 我想静态链接 opencv 库 我正在做的是我的项目中有一份 opencv 源
  • 将文本从文本文件添加到 PDF 文件[重复]

    这个问题在这里已经有答案了 这是我的代码 using FileStream msReport new FileStream pdfPath FileMode Create step 1 using Document pdfDoc new D
  • 如何从函数返回矩阵(二维数组)? (C)

    我创建了一个生成宾果板的函数 我想返回宾果板 正如我没想到的那样 它不起作用 这是函数 int generateBoard int board N M i j fillNum Boolean exists True initilize se
  • 如何确定给定方法可以抛出哪些异常?

    我的问题和这个真的一样 找出 C 中方法可能抛出的异常 https stackoverflow com questions 264747 finding out what exceptions a method might throw in

随机推荐

  • 嵌套 vue.js 实例/元素

    这可能听起来像一个真正的菜鸟问题 但我对 MVVM 甚至 JS 中的 MVC 都很陌生 所以提前抱歉 我正在使用 vue js 并且到目前为止很喜欢它的简单性 但对于我想做的事情 我认为我需要以不同的方式去做 我想将 Vue 实例 元素嵌套
  • 从两个多态类继承

    给出以下代码 class T public virtual T virtual void foo 0 class U public U U void bar std cout lt lt bar lt lt std endl class A
  • 如何在 join linq 语法中比较 null

    处理 EF 4 C Face join 中的问题 SQL语法 Select a Code b Name from DepartmentMaster a Join DepartmentDetail b on isnull a ID 0 isn
  • 如何在 Snakemake 表格配置中使用列表,用于描述生物信息学管道的测序单元

    如何在 Snakemake 表格配置中使用列表 我使用 Snakemake Tabular 与 BWA mem 映射 配置来描述我的测序单元 在单独的行上测序的文库 在分析的下一阶段 我必须合并测序单元 映射的 bed 文件 并获取合并的
  • 使用 PORT=XXXX 启动节点永久脚本

    当通过特定端口运行节点命令时 我会这样启动应用程序 PORT 1234 node app js 我如何将端口传递给forever命令 无论我做什么 似乎都不想工作 我试过了 将端口作为参数传递 forever start app js 12
  • 循环浏览用户指定的根目录中的子文件夹和文件[重复]

    这个问题在这里已经有答案了 我通过各个文件的循环脚本工作正常 但我现在还需要它来查找多个目录 我被困住了 事情发生的顺序 提示用户选择他们需要的根目录 我需要脚本来查找该根目录中的任何文件夹 如果脚本找到一个 它将打开第一个 所有文件夹 因
  • 如何在Java中使用Graphics2D旋转文本?

    我想使用 Graphics2D 旋转 JPanel 上的文本 我的代码是这样的 double paso d width numeroBarras double alto datos i valor Font fBarras new Font
  • 在 MATLAB 中实现显式欧拉方法(适用于 ODE)

    我到处都找过了 但什么也没找到 首先 我想说我从未使用过 Mat Lab 所以我不知道我在做什么 我尝试了一些方法 但没有任何效果 显然 y 0 2 试图创建一个包含 0 个值为 2 的单位的列表 无论如何 有人可以帮助我吗 我需要在 Ma
  • 我们可以在透明窗口上应用着色器吗

    I am looking to apply a particular shader to a transparent window for example on a live desktop I want to create a trans
  • Perl XML::LibXML $node->findnodes($xpath) 找到它不应该找到的节点

    这是我遇到问题的一些代码 我处理一些 XML 并在 OO 类的方法中从文档中重复的几个节点中的每个节点提取一个元素 每个节点的子树中应该只有一个这样的元素 但我的代码获取所有元素 就好像它对整个文档进行操作一样 因为我只期望获得 oine
  • SSRS 报告显示为列出的目录

    如何获取 SSRS 报告以显示网页视图 当我转到 SSRS 报告页面时 它没有显示网页视图 它显示数据源 数据集和报告文件夹的列表 进入报告文件夹后 我可以通过单击它们来调用报告 没有任何问题 https docs google com f
  • 以分离模式启动的 docker 容器在进程执行后停止

    我使用以下命令以分离模式创建 docker 容器 docker run OPTIONS name my image d container name bin bash c opt init sh 所以我需要在创建的容器中执行 opt ini
  • 排序时保留 JSON 数组

    我有两个来自外部网站的 JSON 数组 我对两个数组进行排序和合并 对其进行解码 然后按 ID 从最高到最低对它们进行排序 目前 当单击 按字母顺序 选项时 sort alphabetical添加到 URL 的末尾 当页面完成重新加载时 J
  • 忽略 $Id 行的合并工具

    我需要合并一个分叉项目 不幸的是 CVS Id 行不同 因此我尝试的合并工具报告所有文件都不同 其中 95 只有这一行不同 是否有一个合并工具可以配置为忽略基于模式的行比较结果 编辑 我发现 WinMerge 有线路过滤器 正确设置它们实际
  • supertest的expect和then有什么区别?

    使用时supertest为了在 JavaScript 中测试异步 HTTP 请求 这两个片段有什么区别 其中一项是正确的 另一项是错误的吗 request http localhost 8080 get api people expect
  • 在 Fluent Migrator 中回滚到以前的版本

    我正在尝试使用流畅的迁移器来进行我的项目的迁移 但由于缺乏文档 我正在努力弄清楚如何回滚并拥有Down方法调用了我的迁移类 我使用初始版本 1 类设置了数据库 Migration 1 public class Baseline Migrat
  • Python:如何保存16位通道的图像(例如48 RGB)?

    我正在科学地处理显微镜图像 其中 3 个 RGB 通道均编码为 uint16 0 65536 目前 我使用 OpenCV2 和 NumPy 来处理图像 并使用标志 cv2 IMREAD UNCHANGED 读取一切正常 我可以对图像做一些工
  • 无法通过任何方式将 .h5 模型转换为 ONNX 进行推理

    我在 h5 中构建了一个自定义模型Matterport Mask RCNN 实现 https github com matterport Mask RCNN 我成功地保存了完整的模型 而不是单独使用的权重model keras model
  • 如何增加nest.js应用程序中的内存堆?如何在 cli 中使用 --max-old-space-size ?

    我正在使用 Nest js 框架开发 Node js 项目 但出现错误 JavaScript 堆内存不足 我的问题是如何为我的应用程序分配更多内存 我还发现有些人说我应该使用 max old space size 分配内存 所以我尝试将此选
  • 如何在实际需要 C# 静态类之前对其进行初始化?

    我有一个带有静态构造函数的静态类 需要一些时间 10 15 秒 来执行并完全初始化该类 为了提高性能 我决定让这个静态类显式初始化 而不是在第一次需要它时初始化 以便在实际需要使用时它就可以使用了 我的第一个想法是创建一个Initializ