RSW*_*RSW 16 c# visual-studio-2010
考虑以下C#代码:
using System;
class Program
{
static string string1 = "AAA";
static string string2 = string1 + string3;
static string string3 = "BBB";
static void Main()
{
Console.WriteLine(string2);
}
}
Run Code Online (Sandbox Code Playgroud)
我今天早些时候写了一些这样的代码,并期望string2包含值AAABBB,但它只包含它AAA.我对静态变量的初始化顺序进行了一些阅读,但在编译过程中,我似乎更喜欢某种类型的警告或错误.
两个问题:
为什么允许这样的代码成功编译?(如果答案是:"因为那是C#规范的编写方式",那么为什么它是这样编写的?有没有理由我错过了为什么这不优选总是只抛出编译时错误?)
有没有办法获得编译时警告或其他类型的标志,如果我最后无意中再次编写这种代码?
问题2:
像ReSharper这样的工具可以捕获这些东西.Visual Studio中可能有一个设置,您可以打开它以获得更详细的编译输出.

这是Reshaper清理后产生"AAABBB"的代码
class Program
{
private const string String1 = "AAA";
private const string String2 = String1 + String3;
private const string String3 = "BBB";
static void Main()
{
Console.WriteLine(String2);
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
作为旁注,我要说,因为我们通常从上到下阅读,所以初始化的发生方式与C#规范10.4.5.1中描述的相同.
如果您认为静态初始化器在逻辑上是静态构造函数的一部分,那么事情会更有意义.在你的情况下,就像你写的那样:
private static string String1;
private static string String2;
private static string String3;
static Program()
{
String1 = "AAA";
String2 = String1 + String3;
String3 = "BBB";
}
Run Code Online (Sandbox Code Playgroud)
静态初始化程序无法按您所希望的方式工作的原因是,在一般情况下,编译器无法重新排序.在这种情况下,以及许多其他情况下都可以.但是如果你考虑二阶效应,比如我在回答类似问题时提到的,编译器就无法可靠地重新排序任何东西.
如果编译器"有时"进行重新排序,那将极其令人困惑.
至于 #1:允许编译代码的原因是,根据 C# 规范 10.4.5.1,“类的静态字段变量初始值设定项对应于按文本顺序执行的一系列赋值它们出现在类声明中。” 这意味着您的string2变量已明确初始化为"AAA" + null. 有争议的是,您至少应该收到警告...至于为什么您的 IDE 选择不警告您,我不知道。
关于#2:我不知道。如果也用您的 IDE 标记的话,这似乎是一个更合适的问题。
| 归档时间: |
|
| 查看次数: |
221 次 |
| 最近记录: |