【问题标题】:In C# set value to a constant property在 C# 中将值设置为常量属性
【发布时间】:2017-08-31 14:20:43
【问题描述】:

我正在部分修改一个应用程序,我需要将以下常量的值设置为环境变量的值如果存在

我已经拥有的:

private const string BuildPackagePath = @"\\server\build\";

我想做的是:

if (Environment.GetEnvironmentVariable("EnvVar") != null)
Set the property value to = Environment.GetEnvironmentVariable("EnvVar")
else
{Keep default/assigned value}

我了解分配的左侧必须是变量。我可能不得不更改类型,但只是想知道是否有人可以给我一个想法,以便可以保持当前代码的结构。

【问题讨论】:

  • 你不能修改常量值,这就是为什么它被称为 constant。但是,您可以使用readonly 表示该成员只能在构造函数中进行修改。
  • 谢谢!我只是想检查一下
  • 对于大多数意图和目的,static readonly 将像const 在运行时一样工作。如果你需要一个编译时间常数,你当然不能使用它。 -- 所以你可以有private static readonly string BuildPackagePath = Environment.GetEnvironmentVariable("EnvVar") ?? @"\\server\build\";

标签: c# constants


【解决方案1】:

考虑使用不带 setter 的静态属性

// evaluates Environment Variable on each call
private static string BuildPackagePath 
{
    get { return Environment.GetEnvironmentVariable("EnvVar") ?? @"\server\build\"; }
}

静态只读字段只会评估一次环境变量(但不会在启动时立即评估When do static variables get initialized in C#?

private static readonly string BuildPackagePath = 
        Environment.GetEnvironmentVariable("EnvVar") ?? @"\server\build\";

【讨论】:

  • 请注意,每次调用 getter 时都会对其进行评估...如果在运行时设置了 EnvVar,则结果可能会改变。
  • @Fildor,是的。它可能需要,也可能不需要。如果没有,那么 static readonly 字段而不是属性应该可以工作,因为它被初始化一次。 readonly 实例字段将为每个新对象重新评估 EnvironmentVariable。多种选择,根据需求选择
  • 我同意,它可能是需要的。我只是想指出这种行为以避免“意外”。
【解决方案2】:

你不能修改常量值,这就是为什么它被称为constant。但是您可以使用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\";
    }
}

使用null-conitional operation 甚至更短:

this.BuildPackagePath = value ?? @"\server\build\";

【讨论】:

    【解决方案3】:

    您可以使用“readonly”修饰符代替 const。然后,您可以在类的构造函数中设置字段的值。例如:

    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;
          }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多