Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-当引用类常量时,为什么执行会流向实例变量?_C#_Singleton_Constants_Partial_Sealed - Fatal编程技术网

C#-当引用类常量时,为什么执行会流向实例变量?

C#-当引用类常量时,为什么执行会流向实例变量?,c#,singleton,constants,partial,sealed,C#,Singleton,Constants,Partial,Sealed,在下面的代码段中,我引用了这个类之外的FILE\u LOCATION,在执行流入这个类以访问该常量之后,出于某种原因,执行将继续实例化该单例,而不是继续返回进行常量调用的位置 我的问题分为两部分;为什么会发生这种情况?我该如何解决?我试图创建两个分部类,一个单独用于常量,另一个用于其他所有内容,但执行仍然继续到另一个分部类来实例化单例 public sealed class Foo { public static readonly string FILE_LOCATION = @"p

在下面的代码段中,我引用了这个类之外的
FILE\u LOCATION
,在执行流入这个类以访问该常量之后,出于某种原因,执行将继续实例化该单例,而不是继续返回进行常量调用的位置

我的问题分为两部分;为什么会发生这种情况?我该如何解决?我试图创建两个分部类,一个单独用于常量,另一个用于其他所有内容,但执行仍然继续到另一个分部类来实例化单例

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...
 }
该属性是通过单击按钮从窗体类的实例引用的:

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#保证在访问任何单个静态变量之前初始化所有静态变量。调用静态变量时,访问
    文件\u位置
    ,然后所有静态变量初始值设定项都会运行(包括
    foo
    )。在那之后,跑步。因为没有显式的静态构造函数,所以这里什么都不做。然后你的代码运行。发生这种情况的原因是,有时一个静态变量的值可能会根据另一个静态变量进行初始化,因此需要同时对它们进行初始化
  • 要解决此问题,您可以将其声明为
    public const string FILE\u LOCATION
    ,而不是使用
    public static readonly string FILE\u LOCATION
    。常量的值是在编译时而不是在运行时确定的,因此当您访问
    文件位置时,静态变量
    foo
    将不会初始化。如果您可以在编译时确定文件位置的值,那么这可以起作用;这是你可以在你的申请中做的吗

  • 确实需要更完整的代码才能与此交互。很抱歉,我添加了代码来显示常量是如何被引用的。我想不出还有什么会影响功能的东西。@zposten:关于另一个问题,我想你还没有完全理解什么是分部类。分部类只是将大型类拆分为单独的.CS文件的一种方法。就编译器而言,它们是同一个类。这绝对是问题所在!谢谢你精彩的演绎和解释。