2010-04-29 77 views
2

假设我有几个只读变量用于文件路径,我能否根据声明的顺序来保证赋值的顺序?readonly变量声明的顺序是否保证了值的设置顺序?

例如

static readonly string basepath = @"my\base\directory\location"; 
static readonly string subpath1 = Path.Combine(basepath, @"abc\def"); 
static readonly string subpath2 = Path.Combine(basepath, @"ghi\klm"; 

这是一种安全的方法或者是有可能,basepath仍可能是当时subpath1subpath2字符串的默认值使该字符串的引用?

我知道我可以通过在构造函数中赋值而不是在声明时保证顺序。但是,我相信如果我需要在静态类中声明变量(例如,用于控制台应用程序的Program.cs,它具有静态无效的Main()过程而不是构造函数),则无法实现此方法。

UPDATE:

我已经添加了static关键字(因为这是我使用的是什么,以及为什么它编译),也Path.Combine的建议。

+0

为什么不让它们成为'const'?用'const'你可以肯定。 – Steven 2010-04-29 17:30:52

+0

这些路径可能成为程序集中其他代码依赖的程序集的一部分。有可能这些路径可能会改变,我希望能够做到这一点,而不必重新编译依赖这些路径值的程序集的其余部分。对于常量,我别无选择,只能重新编译所有内容,而不仅仅是DLL。 – 2010-04-29 17:46:18

回答

3

该命令并不重要。运行时确保所有对象在使用时都被初始化。

您的具体情况实际上并不可编译,因为无法保证。

你对构造方法是正确的。如果你需要这个静态变量,这也不是问题,因为你可以指定一个静态构造函数。

而btw:连接目录的正确方法是使用Path.Combine而不是字符串连接。

+0

我忘了Path.Combine方法。感谢您的提醒。 – 2010-04-29 17:42:47

+0

***在给出这个答案后,问题被更新了。***当问题字段是“静态”时,文本顺序非常重要。初始化程序按文本顺序运行。所以这个答案误导了'静态'字段。 (静态或非静态是重要的;只读或不重要。) – 2013-04-29 18:58:41

0

“是有可能。”

没有,编译器不会让你从subpath1/2声明访问基本路径。你可以用常量来代替只读变量。

+0

通过说编译器不会让我说你的代码不会编译?它为我编译。 – 2010-04-29 17:39:32

+0

刚试过,我得到“字段初始值设定项不能引用非静态字段,方法或属性......”。 – heisenberg 2010-04-29 17:46:19

+0

我明白了。事实证明,在这种情况下,这些实际上是我使用的静态只读字符串,因此这解释了为什么我得到的结果与您不同。 – 2010-04-29 17:47:28

0

我怀疑你真的想使用常量:在代码

const string basepath = @"my\base\directory\location"; 
    const string subpath1 = basepath + @"\abc\def"; 
    const string subpath2 = basepath + @"\ghi\klm"; 

subpath1/2将绝对有填写基本路径前缀不论声明顺序。

+2

我总是对常量和只读都感兴趣。我读过很多说不使用常量的东西,如果有可能改变的话。这些路径可能成为其他代码依赖的程序集的一部分。我希望能够更改这些路径,而无需重新编译依赖这些路径值的其余程序集。对于常量,我别无选择,只能重新编译所有内容,而不仅仅是DLL。 – 2010-04-29 17:45:06