问题标签 [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 投票
1 回答
1034 浏览

.net-4.0 - 不调用派生类的c++/cli静态构造函数

正如我在另一篇 SO 帖子中所述,在从 VS 2008(.net 3.5)迁移到 VS 2013(并使用 .net 4.0,而不是 4.5)后,我看到了我的应用程序的一个奇怪行为。我发现一个类的静态构造函数(cctor)不再被调用。因此,我将应用程序分解为一个小测试程序:

DLL testAssembly_2-0 和 testAssembly_4-0
(类似的内容;testAssembly_4-0 的名称带有40而不是20

main VS2008
在编译testAssembly_2-0main在 VS 2008 中(制作 .net 2.0 程序集和应用程序)时,它在两种执行方式下都按预期运行(在 IDE 中启动调试模式,直接启动 exe):

main VS2013
在编译testAssembly_4-0main在 VS 2013 中(创建 .net 4.0 程序集和应用程序)并包括现有的.net 2.0 testAssembly_2-0(使用 app.config,请参阅我的链接帖子)时,它仍然有效,但与 IDE 调试与 exe 启动相比,它的行为不同。
IDE 调试产生如上的结果(一次Class20和一次Class40)。
exe start 调用cctor不是在类实例化时,而是在第一次访问静态成员时调用。这一定是由于 .net 4.0 引入的所谓延迟初始化,据我在过去几个小时的研究中所知道的。

DLL 增强
由于这还没有重现我的失败,我在类中添加了一个属性来访问静态成员,就像在我的原始应用程序中一样。查询这个属性main()只是导致函数调用的顺序不同(Class20 cctor现在首先调用的是所有函数,直接在开头main())。但行为是正确的。

因此,我向我的原始应用程序更进了一步,并将派生类添加到两个程序集中:

main VS2008 new
测试程序现在创建派生类的对象。它以两种执行方式(IDE,exe直接)按预期运行:

main VS2013 new
测试程序现在创建两个派生类的对象。从 IDE 启动时,它按预期运行(结果与 VS2008 new 相同,一次使用 Class40,一次使用 Class20)。
但是在启动exe时,结果是错误的:

为什么 .net 2.0 程序集的派生 cctor() 没有被调用?
这是.net 4.0延迟初始化的预期行为,还是我假设它是编译器中的错误?奇怪的是,.net 4.0 程序集使用正确,但 .net 2.0 程序集没有。

另外,在顶部的基类中:
为什么在类实例化时调用 .net 4.0 cctor,但按需调用 .net2.0 cctor?

编辑 1

我刚刚发现,一个相同的应用程序(VS2008,DLL 增强)在作为 exe 执行时,无论是否带有 app.exe.config,行为都会有所不同!
当 app.config 存在时,应用程序就像在 VS2013 中编译一样工作,这意味着它是错误的。

但是一旦我删除了 app.config,应用程序就会运行良好。
所以我认为这个错误不在 VS C++/CLI 编译器内部,而是在 .net 4.0 CLR 本身内部......

0 投票
2 回答
2304 浏览

c# - 静态构造函数不适用于结构

环境:C#6、Visual Studio 2015 CTP 6

给定以下示例:

}

由于某种原因,静态 ctor 没有被执行。如果我将 SavingsAccount 声明为一个类而不是一个结构,它就可以正常工作。

0 投票
3 回答
999 浏览

c# - 只运行一次的类是否应该包含静态构造函数?

我开始用 C# 学习 OOP 编程。static关于设计,考虑到这个类包含只能运行一次的代码(我的整个程序非常简单,只包含一个 .cs 文件),对我来说,为我的程序的主类使用构造函数是有意义的。

例如,这是一个使用普通构造函数的示例代码:

这里遵循相同的结构,但使用static构造函数,因为我认为它已经足够了。通知status访问也发生了变化。


问题:我的假设是否正确,使用第二个代码而不是第一个代码?还是我错过了什么?换句话说:哪一个更可取(被认为是更好的设计)?在这种情况下,静态构造函数是否有一些基本的东西会给我带来麻烦?

0 投票
2 回答
1708 浏览

java - 如何在 JAVA 中获得静态构造函数的功能?

我正在学习我在 C# 中找到Static Constructor的 C# 和 JAVA,它们用于初始化任何静态数据,或执行只需要执行一次的特定操作。在创建第一个实例或引用任何静态成员之前自动调用它。

例如:

我的问题是我怎样才能在 JAVA 中获得相同的功能有什么办法吗???

0 投票
1 回答
840 浏览

c# - 为什么 FieldInfo.GetValue(null) 在静态构造函数中不起作用

请参阅下面的代码。我想要一个自动枚举其自身类型的所有已定义静态只读实例的类(以 TestClass 为例,它定义了其自身类型的 3 个静态只读实例)。

我想要这种自动化,因为我想循环定义的类型,而不是冒忘记将新实例添加到All.

好的,我有它的工作,这不是重点。但是为什么FillAll从静态构造函数调用时不起作用?请参阅代码中注释的静态构造函数DefinedInstancesBase<T>。我的意思是在静态构造函数中返回 null,尽管调试器在调用FieldInfo.GetValue(null)之前已经创建了静态只读实例。FieldInfo.GetValue(null)

我很好奇为什么它不起作用。这是设计使然吗?

0 投票
1 回答
377 浏览

c# - 使用静态构造函数时 Visual Studio 的智能感知中断

我对视觉工作室的智能感知有疑问。每次我C#在结构中创建静态构造函数时,Visual Studio 的智能感知在尝试调用构造函数时都会中断。似乎它找不到构造函数,甚至没有默认构造函数。有谁知道我为什么会遇到这个问题?

没有智能感知

0 投票
1 回答
23 浏览

c# - 由两个不同的应用程序获得一次实例的类

我创建了一个类来验证我的项目。

我想在我的网站和移动应用程序中使用它,但是为什么这个类有一个静态构造函数并且应该一次获取实例,它不能很好地工作,我的意思是我想为每个应用程序获取一次实例。

我想知道怎么修?

0 投票
1 回答
517 浏览

c# - 填充 ConcurrentDictionary 时 C# 静态构造函数初始化线程安全

我打电话var person = PersonDB.pDict["395096"];

谁能解释一下为什么这段代码会阻塞:

虽然这部分不会阻塞:

老实说,我什至不确定后者现在是否是线程安全的,但至少它运行没有问题。我想知道如何使 PersonDB 成为线程安全类,这样就不会出现竞争条件或死锁。pDict 需要在使用 pDict 时创建一次。我认为静态构造函数是一个很好的解决方案,但是 PLINQ 查询的执行停止让我非常不确定......

0 投票
2 回答
63 浏览

python - 如何扩展静态基础构造函数?

我正在使用 Pythonbitmap

它几乎可以满足我的所有需求,但它不适用于我的应用程序所需的十六进制值,因此我将其扩展如下:

基类有一个来自字符串的静态构造函数:

我可以用十六进制将十六进制值转换为bin:

但返回的类是原始位图类,而不是扩展类。

如何使用此构造函数但仍返回我的扩展类?

0 投票
2 回答
133 浏览

c++ - 在 C++ 中实现静态构造函数不起作用

http://ideone.com/1ohrsO

push_back构造函数内部的调用static_constructor没有反映。为什么?

输出: