在C#中,将值设置为常量属性
我正在部分修改一个应用程序,其中需要将以下常量的值设置为环境变量的值(如果存在) 我已经拥有的:在C#中,将值设置为常量属性,c#,constants,C#,Constants,我正在部分修改一个应用程序,其中需要将以下常量的值设置为环境变量的值(如果存在) 我已经拥有的: private const string BuildPackagePath = @"\\server\build\"; 我想做的是: if (Environment.GetEnvironmentVariable("EnvVar") != null) Set the property value to = Environment.GetEnvironmentVariable("EnvVar") el
private const string BuildPackagePath = @"\\server\build\";
我想做的是:
if (Environment.GetEnvironmentVariable("EnvVar") != null)
Set the property value to = Environment.GetEnvironmentVariable("EnvVar")
else
{Keep default/assigned value}
我知道asignment的左边必须是一个变量。我可能不得不更改类型,但我只是想知道是否有人能给我一个想法,使当前代码的结构保持原样。您不能修改常量值,这就是为什么它被称为常量。但是,您可以使用
readonly
指示只能在构造函数中修改成员:
class MyClass
{
private readonly string BuildPackagePath;
public MyClass()
{
var value = Environment.GetEnvironmentVariable("EnvVar");
if(value != null) this.BuildPackagePath = value;
else this.BuildPackagePath = @"\server\build\";
}
}
甚至更短,使用:
考虑使用不带setter的静态属性
// evaluates Environment Variable on each call
private static string BuildPackagePath
{
get { return Environment.GetEnvironmentVariable("EnvVar") ?? @"\server\build\"; }
}
静态只读字段将只对环境变量求值一次(但不会在启动时立即求值)
您可以使用“只读”修饰符而不是常量。然后可以在类的构造函数中设置字段的值。例如:
class SampleClass
{
public int x;
// Initialize a readonly field
public readonly int y = 25;
public readonly int z;
public SampleClass()
{
// Initialize a readonly instance field
z = 24;
}
}
您不能修改常量值,这就是为什么它被称为常量。但是,您可以使用
readonly
指示只能在构造函数中修改成员。谢谢!我只是想检查一下,在运行时,static readonly
将像const
一样工作。如果你需要一个编译时常量,你当然不能使用它所以您可以使用私有静态只读字符串BuildPackagePath=Environment.GetEnvironmentVariable(“EnvVar”)@“\\server\build\”代码>请注意,每次调用getter时都会对其进行计算。。。如果在运行过程中设置了EnvVar,结果可能会改变。@Fildor,是的。这可能是你想要的,也可能不是。如果不是,则应该使用静态只读
字段而不是属性,因为它只初始化一次<代码>只读
实例字段将为每个新对象重新计算EnvironmentVariable。许多选项,根据需要选择。我同意,这可能是需要的。我只是想指出这种行为是为了避免“意外”。
private static readonly string BuildPackagePath =
Environment.GetEnvironmentVariable("EnvVar") ?? @"\server\build\";
class SampleClass
{
public int x;
// Initialize a readonly field
public readonly int y = 25;
public readonly int z;
public SampleClass()
{
// Initialize a readonly instance field
z = 24;
}
}