问题标签 [static-constructor]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
3047 浏览

c# - 如何触发静态构造函数

代码:

多亏了 .NET 的泛型,我可以使用泛型基类中定义的泛型静态方法创建一堆特定的类。它可以在一定程度上模仿继承多态性。但是为了初始化不同版本的静态字段,我必须使用静态构造函数。不幸的是,我们不能直接调用它们,因此,我们必须想办法触发它的调用。上面给出的示例显示了一种方法。但我不喜欢实例化或反射方法。我们也不能对泛型参数的静态方法进行约束。所以,我想问一下,是否还有其他方法可以完成这种工作!

预先感谢!

~~~~~~~~~~~~~~~~

一些结论(可能有点早):

似乎没有解决方法来处理这种情况。我必须实例化一个子类或使用反射。考虑到 .cctors 只需要调用一次,我赞成反射方法,因为在某些情况下, new() 约束不是一种选择——就像你不应该将无参数 ctor 暴露给用户一样。

经过进一步的实验,我发现 .cctors 可能会被多次调用,但只有第一次调用会影响静态字段的设置。这很奇怪,但很奇怪!

0 投票
2 回答
3365 浏览

c# - 在 C# 中,静态构造函数是为对象的每个初始化运行还是只运行一次?

在我的类中,我有一个字符串对象的静态字典,其中包含大量项目(它从文件中读取并初始化它们)我写了一个静态构造函数来这样做,它需要几秒钟,但我想这样做一次更快,因为我是在 ASP.Net 中做的,我希望我的网站没有这个开销,我该怎么办?如果这个构造函数为每个对象运行,那么我正在考虑一些方法,但我想我必须在用户运行的网站的每个页面中运行这个方法,所以我再次认为它会是一样的,对吗?您只初始化一次大量变量的解决方案是什么?谢谢

0 投票
3 回答
947 浏览

c# - 静态构造函数会降低访问静态方法的性能吗?

首次访问静态成员时会执行静态构造函数。知道了这一点,我有几个问题:

  • 这是否意味着每次访问静态方法时,运行时都必须检查是否调用了静态构造函数?
  • 这会影响性能吗?
  • “无构造函数”静态类是否避免了这种性能损失?

[编辑]:我想澄清一下,我不关心微优化。
我问这个问题是因为这是一个设计决定。如果静态构造函数导致性能下降,那么我将在设计代码时考虑到这一点,并且会更加了解可能影响性能的决策。

这是一个例子来说明我的问题。Independent采用该方法并将其放在单独的静态类中会有什么好处吗?这样,它就不必检查 staticTest是否已初始化。[更新请参阅下面的答案以获得更好,更简单的示例]。

这是 C# 规范中关于静态构造函数的引用

静态构造函数的执行由在应用程序域中发生的以下第一个事件触发:

  • 类的一个实例被创建。
  • 类的任何静态成员都被引用。
0 投票
4 回答
2751 浏览

java - 一类静态方法中的构造函数

我有一类静态方法,可以在类中保存的地图上执行,我希望在调用类时设置地图。我试过使用私人承包商,但没有被调用。我的代码的相关部分是:

在这里使用私有构造函数是否正确,如果是,我做错了什么?

抱歉,如果这是重复的;我已经尝试搜索答案,但我不确定要搜索什么!

0 投票
6 回答
15031 浏览

java - 将参数传递给Java中的静态构造函数?

我正在尝试使用参数初始化一个静态类,然后在该类中运行更多静态代码。
我知道这个static块,但它似乎不能接受任何论点。
有没有办法将参数传递给静态构造函数?
如果不是,使用参数初始化静态类的推荐技术是什么?

编辑: 我理解的静态类是一个无法实例化的类(在 c# 中,它们被称为静态类,如果 Java 对它们有不同的术语,很抱歉没有意识到它) - 它是通过它的类名访问的,而不是而不是对象名称。

我想要实现的(非常简化)是一个类,它接收字典作为字符串,解析它,并让方法像GetRandomEntry.

这是我的代码的详细片段:

获取代码片段的相关部分绝非易事,希望我做出了明智的选择(:
另一个可能相关的细节 - 我通常是 ac# 程序员。最近刚开始学习 Java。

谢谢。

0 投票
1 回答
122 浏览

c# - 为什么在继承类中输入静态 .ctors 的顺序与实例 .ctors 不同?

为什么var b = new B()首先进入static B().ctor 和 than而不是像实例构造函数那样(和 than )反之?static A() .ctorpublic A()public B()

0 投票
1 回答
2081 浏览

c# - VS2010 没有中断对静态构造函数异常的调试

我有一个带有单个Editor类(继承自Form)的 Windows 窗体应用程序。

除了设计器生成的代码之外,这是表单的唯一代码(仅包含一个组合框 ( cmbConnections)。

该类ConnectionManager是具有静态构造函数的静态类。它的构造函数进行一些初始化,然后测试一些临界条件。如果满足条件,构造函数会抛出异常。但是,此异常不会在 Visual Studio 2010 中的调试模式下中断。为了对此进行测试,我只throw new Exception()放入了ConnectionManager的静态构造函数。在事件处理程序ConnectionManager中使用并因此初始化(第一次) 。Editor_Load调用静态构造函数并抛出异常(仅在输出窗口中可见)。正如预期的那样,Editor_Load事件处理程序 ( )的其余部分没有被执行。cmbConnections.Visible = false;

但是我不明白的是为什么我的VS2010会吞下异常?它没有破坏调试。它不包含在任何 try/catch 块中。它继续在主窗口中执行程序。几乎看起来好像Editor_Load是在另一个线程上执行的。

我可以在输出窗口中看到消息:

在 Editor.exe 中发生了“System.InvalidOperationException”类型的第一次机会异常

在 Editor.exe 中发生了“System.TypeInitializationException”类型的第一次机会异常

但执行根本没有在调试模式下中断。

以下是我认为可能会影响此行为的一些选项:

项目属性->构建->常规->优化代码未选中。

工具->选项->调试->常规->仅启用我的代码已选中。

在异常设置中,“用户未处理”的复选框已选中。

我错过了什么吗?这种行为正常吗?我认为 VS2010 会抛出任何未处理的异常。而这里这个是未处理的,仍然没有中断。

0 投票
2 回答
503 浏览

c# - C# 如何知道何时运行静态构造函数?

我不相信生成的代码会在每次访问静态成员(包括函数)时检查类是否已初始化。我相信检查每一次访问都是低效的。我查看了 ECMA 334 中的 §17.11,它说

静态构造函数的执行由在应用程序域中发生的以下第一个事件触发:

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

看起来如何确定“第一次”发生的时间没有定义。我想不出任何办法,只能每次检查。怎么可能做到?

0 投票
10 回答
10630 浏览

c# - 静态构造函数是如何工作的?

这是我假设的顺序

  1. 静态构造函数的开始
  2. 静态构造函数结束
  3. 主线开始
  4. MyMethod 的开始
  5. 主线结束

现在在任何情况下,如果 4 将在 2 之前开始,我就完蛋了。是否可以?

0 投票
1 回答
4456 浏览

wcf - 在每次调用中调用 WCF 服务类静态构造函数

我有一个实现合同的服务类,如下所示:

我正在确定的是,每次调用 Foo API 时,都会调用静态构造函数。所以,日志看起来像这样 -

称为 Foo 的静态构造函数称为 称为
Foo 的
静态构造
函数

这不应该发生,因为这是一个静态构造函数。知道可能出了什么问题吗?

谢谢你的帮助