我最近在接受采访时提到了这个问题.
我回答说如果交错出错就会发生死锁,但是访问者坚持认为可以编写一个总是会陷入死锁的程序而不管交错.
我们可以写这样的程序吗?你能指点我这样的示例程序吗?
我试图将C#程序的输出重定向到文件.使用"cmd.exe"时,我可以简单地运行它myprogram.exe arg1 arg2 > out.txt,但我想使用Visual Studio 启动选项完成相同的操作.
我创建了一个C#Empty Project并添加了以下代码:
using System;
class Test
{
public static void Main(string[] args)
{
foreach (var arg in args) Console.WriteLine(arg);
}
}
Run Code Online (Sandbox Code Playgroud)
然后我在项目设置中编辑了命令行参数:

使用Ctrl + F5运行项目不能按预期工作.我得到控制台中打印的命令行参数,而不是输出文件:
arg1
arg2
>
output.txt
Run Code Online (Sandbox Code Playgroud)
如果我将命令行参数更改为:arg1 arg2 "> output.txt"我得到以下输出:
arg1
arg2
^> output.txt
Run Code Online (Sandbox Code Playgroud)
我注意到output.txt在Output文件夹中创建了一个空文件.
这件事有可能完成,还是我被迫继续使用cmd.exe来启动我的程序?
每个人都说静态初始化程序是线程安全的,但我担心一个特定的细节.
让我说我有
static class MyStaticClass
{
public static readonly object myField = MyOtherClass.GetNewObject();
}
static class MyOtherClass
{
public static object GetNewObject()
{ /* arbitrary code that returns a new object */ }
}
Run Code Online (Sandbox Code Playgroud)
C#保证以下哪一项MyStaticClass.myField尚未初始化?
如果线程1和2尝试一起访问myField(按此顺序),GetNewObject则在线程2读取之前将开始执行myField.
如果线程1和2尝试一起访问myField(按此顺序),GetNewObject则在线程2读取之前将完成执行myField.
一般来说CLR怎么样:如果它的保证与C#不同,它们在哪些方面有所区别?
在更新版本的.NET框架中是否更改了行为?
这是一个棘手的问题,我认为完整的答案可能会提到静态构造函数和静态初始化程序之间的区别,以及它们如何交互beforefieldinit以产生声明的结果.