C# - 为什么在引用 class 常量时执行流向实例变量?
C# - Why does execution flow to instance variables when a class constant is referenced?
在下面的代码段中,我从这个 class 外部引用 FILE_LOCATION
,并且在执行后流入这个 class 以访问该常量,出于某种原因而不是继续返回到进行常量调用的位置,执行继续实例化单例。
我的问题分为两个部分;为什么会发生这种情况,我该如何解决?我试图创建两个部分 classes,一个仅用于常量,另一个用于其他所有内容,但是执行 still 继续到另一个部分 class 以实例化单例。
public sealed class Foo
{
public static readonly string FILE_LOCATION = @"path\to\file";
// (singleton code modeled after:
// http://csharpindepth.com/articles/general/singleton.aspx --fourth version)
private static readonly Foo foo = new Foo();
// Rest of class implementation...
}
属性 是在单击按钮时从表单实例 class 引用的:
public partial class MyForm : Form
{
public void button1_Click(object sender, EventArgs e)
{
string s = Foo.FILE_LOCATION;
// this location is only reached AFTER the singleton is instantiated.
}
}
按顺序回答您的问题,
- 发生这种情况是因为 C# 保证在您可以访问任何单个静态变量之前初始化所有静态变量。当您调用静态变量时,访问
FILE_LOCATION
,然后是所有静态变量初始值设定项 运行(包括 foo
)。在那之后,static constructor 运行s。由于没有明确的静态构造函数,这里什么也不做。然后你的代码 运行s。出现这种情况的原因是有时一个静态变量的值可能会根据另一个静态变量进行初始化,因此需要同时初始化它们。
- 要解决此问题,您可以将其声明为
public const string FILE_LOCATION
,而不是使用 public static readonly string FILE_LOCATION
。 const 的值是在编译时确定的,而不是在 运行 时确定的,因此当您访问 FILE_LOCATION
时,静态变量 foo
不会被初始化。如果您可以在编译时确定文件位置的值,这就可以工作;这是你可以在你的应用程序中做的事情吗?
在下面的代码段中,我从这个 class 外部引用 FILE_LOCATION
,并且在执行后流入这个 class 以访问该常量,出于某种原因而不是继续返回到进行常量调用的位置,执行继续实例化单例。
我的问题分为两个部分;为什么会发生这种情况,我该如何解决?我试图创建两个部分 classes,一个仅用于常量,另一个用于其他所有内容,但是执行 still 继续到另一个部分 class 以实例化单例。
public sealed class Foo
{
public static readonly string FILE_LOCATION = @"path\to\file";
// (singleton code modeled after:
// http://csharpindepth.com/articles/general/singleton.aspx --fourth version)
private static readonly Foo foo = new Foo();
// Rest of class implementation...
}
属性 是在单击按钮时从表单实例 class 引用的:
public partial class MyForm : Form
{
public void button1_Click(object sender, EventArgs e)
{
string s = Foo.FILE_LOCATION;
// this location is only reached AFTER the singleton is instantiated.
}
}
按顺序回答您的问题,
- 发生这种情况是因为 C# 保证在您可以访问任何单个静态变量之前初始化所有静态变量。当您调用静态变量时,访问
FILE_LOCATION
,然后是所有静态变量初始值设定项 运行(包括foo
)。在那之后,static constructor 运行s。由于没有明确的静态构造函数,这里什么也不做。然后你的代码 运行s。出现这种情况的原因是有时一个静态变量的值可能会根据另一个静态变量进行初始化,因此需要同时初始化它们。 - 要解决此问题,您可以将其声明为
public const string FILE_LOCATION
,而不是使用public static readonly string FILE_LOCATION
。 const 的值是在编译时确定的,而不是在 运行 时确定的,因此当您访问FILE_LOCATION
时,静态变量foo
不会被初始化。如果您可以在编译时确定文件位置的值,这就可以工作;这是你可以在你的应用程序中做的事情吗?