作为一个相对新手,我尽可能多地阅读关于特定主题的内容,并尽可能多地测试/编写代码.我正在看Jons Brainteasers之一(问题#2),我的输出与答案不同.这使我在这里询问最近版本中是否有什么变化,并看看其他人从这段代码中获得了什么输出.
问题是,"将展示什么,为什么,以及你有多自信?"
using System;
class Foo
{
static Foo()
{
Console.WriteLine ("Foo");
}
}
class Bar
{
static int i = Init();
static int Init()
{
Console.WriteLine("Bar");
return 0;
}
}
class Test
{
static void Main()
{
Foo f = new Foo();
Bar b = new Bar();
}
}
Run Code Online (Sandbox Code Playgroud)
什么,如果有的话,会让我们得到两个不同的答案?
我正在阅读使用两个构造函数的C#代码.一个是静态的,另一个是公开的.这两个构造函数有什么区别?为了我们必须使用静态构造函数?
访问修饰符一样public,private是不允许在C#静态构造函数.但是,Visual Studio代码分析在C#安全类别中有一个警告,说" CA2121:静态构造函数应该是私有的 ".
是否可以使静态构造函数非私有?或者是Visual Studio代码分析的错误?
澄清:我不是试图使任何构造函数非私有.所以为什么?" 问题无关紧要.我只是对两个Microsoft工具之间的矛盾感到好奇,并且想知道是否有任何我不知道如何处理静态构造函数的东西.
C#静态构造函数和Java静态块之间的真正区别是什么?
它们都必须是无参数的.当首次使用相关类时,它们都只被调用一次.
我错过了什么,或者他们是同一件事,只是用不同的名字?
在C#或.net IL中是否有办法强制一个具有类型初始值设定项(静态构造函数)的类来加载自身,而不访问它的任何参数?
假设我上了课
public static class LogInitialization {
static LogInitialization() {
System.Console.WriteLine("Initialized");
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法让这条线打印出来?
请注意,该类是静态的,因此我无法将其实例化以强制初始化,并且它没有公共成员,因此我无法访问它们以启动它.
我不相信生成的代码会检查每次访问静态成员(包括函数)时是否已初始化类.我相信检查每次访问都是低效的.我看了ECMA 334中的§17.11,它说
静态构造函数的执行由应用程序域中发生的以下第一个事件触发:
- 创建了一个类的实例.
- 引用该类的任何静态成员.
看起来如何找出"第一次"发生的时间没有定义.我想不出有任何办法,只能每次检查.怎么可能呢?
我正在用C#编写WCF服务.最初我的实现有一个静态构造函数来进行一次性初始化,但是正在进行的一些初始化可能(暂时)失败.
看起来静态构造函数只调用一次,即使第一次(失败)尝试引发了异常?任何后续尝试实例化我的类都将立即失败,并且TypeInitializationException没有实际执行的代码.
C#语言规范声明静态构造函数最多被调用一次,但基本上这会产生一个异常,即使你抓住它也无法从中恢复?
我在这里错过了什么吗?我想我应该向服务的实例构造函数移动任何远程危险的东西,并手动检查类初始化是否已经成功完成了之前?
这不是有效的代码:
public class MyClass
{
private static boolean yesNo = false;
static
{
if (yesNo)
{
System.out.println("Yes");
return; // The return statement is the problem
}
System.exit(0);
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个愚蠢的例子,但在静态类构造函数中我们不能return;.为什么?这有充分的理由吗?有人知道更多关于此的事情吗?
所以我应该做的return就是结束那里的建设.
谢谢
以下程序的输出是:
Non-Static
Static
Non-Static
Run Code Online (Sandbox Code Playgroud)
这是编译器错误吗?我期望:
Static
Non-Static
Non-Static
Run Code Online (Sandbox Code Playgroud)
因为我认为静态构造函数总是在非静态构造函数之前被调用.
我使用.net 3.5和.net 4.0对Visual Studio 2010进行了测试.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace StaticConstructorBug
{
class Program
{
static void Main(string[] args)
{
var mc = new MyClass();
Console.ReadKey();
}
}
public class MyClass
{
public MyClass()
{
Console.WriteLine("Non-static");
}
static MyClass()
{
Console.WriteLine("Static");
}
public static MyClass aVar = new MyClass();
}
}
Run Code Online (Sandbox Code Playgroud) 鉴于以下课程:
public class Foo {
static Foo() {
Console.WriteLine("Foo is being constructed");
}
}
public class Bar {
public void ReferenceFooAsGenericTypeParameter<T>() {
Console.WriteLine("Foo is being referenced as a generic type parameter");
}
}
public class SampleClass
{
public static void Main()
{
new Bar().ReferenceFooAsGenericTypeParameter<Foo>();
}
}
Run Code Online (Sandbox Code Playgroud)
输出是
Foo is being referenced as a generic type parameter
根据规范,这是有道理的:
在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数来初始化类.
但我很好奇为什么在将类型作为泛型类型参数引用时不调用静态构造函数.
c# ×9
.net ×3
java ×2
classloader ×1
clr ×1
exception ×1
generics ×1
return ×1
static-block ×1