【问题标题】:Assigning to static readonly field of base class分配给基类的静态只读字段
【发布时间】:2010-11-28 02:19:49
【问题描述】:
public class ClassA
{
    public static readonly string processName;
} 

public class ClassB : ClassA
{
    static ClassB()
    {
        processName = "MyProcess.exe";
    }
}

编译上述 C# 代码时出现错误。

错误说——“不能将静态只读字段分配给(静态构造函数或变量初始化程序除外)”

但我在静态构造函数中分配它。

对这样一个静态变量的需求是,基类有使用这个变量的方法,但是派生类和基类必须有不同的这个变量的值。但是该值在相应类的所有实例中是恒定的。它必须是只读的,因为它不能被任何地方更改。

以上代码中的错误是什么? (如果有的话)我似乎无法找到一个。错误消息没有帮助。因为我没有做错任何事情。

如果出现错误,我该如何实现这个功能?我知道一个简单的解决方法是将其设为实例变量并在派生类中为它们分配不同的值。但这是不必要的,因为相应类的所有实例中的值都是恒定的。

【问题讨论】:

    标签: c# static readonly static-constructor


    【解决方案1】:

    在您的示例中,将只存在一个字段,即基类的字段,并且您不能在单个字段中具有不同的值。除此之外,您只能在同一类中初始化 readonly 字段,而不能在派生类中初始化。一种解决方法可能是定义一个通用类,例如:

    static class ProcessNames<T> {
       public static string Value { get; set; }
    }
    

    并改用ProcessNames&lt;DerivedClassType&gt;.Value。显然,通过这种方式可以公开访问该值。

    但是,您应该查看在每个派生类中分别定义字段是否符合您的需要,如果不符合则仅求助于变通方法。

    【讨论】:

      【解决方案2】:

      你在 wrong 静态构造函数中赋值。它只能在静态构造函数中赋值用于声明变量的类型

      假设你有另一个从 ClassC 派生的类,它做同样的事情——你最终会覆盖这个变量,这意味着它是只读的。这里有一个单个静态变量,不管你有多少派生类。

      一个答案是避免使用静态变量,而是在基类中放置一个虚拟属性,并让每个派生类覆盖该属性以返回不同的常量:

      public class ClassA
      {
          public virtual string ProcessName { get { return "ClassAProcess"; } }
      } 
      
      public class ClassB : ClassA
      {
          public override string ProcessName { get { return "MyProcess.exe"; } }
      }
      

      基本上,选项是将“静态”位分离到一个单独的层次结构中 - 实际上,这听起来像是您想要类型而不是实例的多态性,而 .NET 不支持。

      【讨论】:

      • 没错! “类型上的多态性”。我不认为它可以更恰当地表达。感谢您指出 .NET 不支持它。
      【解决方案3】:

      给猫剥皮的方法有很多种。这是另一种方法。

      public class ClassA
      {
          public string ProcessName{ get; private set;}
      
          public ClassA()
          {
              ProcessName = "ClassAProcess";
          }
      
          public ClassA(string processName)
          {
              ProcessName = processName;
          }
      }
      
      public class ClassB : ClassA
      {
          public ClassB() : base("ClassAProcess")
          {
          }
      }
      

      【讨论】:

      • 但这仅适用于实例变量,并不能真正实现想要的效果
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      相关资源
      最近更新 更多