4

我有以下基类和派生类(部分,为简洁起见):

class Base {
     public abstract int[] someArray { get; }
}

class Derived : Base {
     private readonly static int[] _someArray = new int[] { 1,2,3,4 };
     public override int[] someArray { 
         get {
              return _someArray;
         }
     }
}

我现在想要的是把getternew int[] { 1,2,3,4 }return一部分。但是,每次调用 getter 时都会创建一个新数组。

是否可以直接返回某种对象,该对象对于 class 的所有对象都保持不变Derived

类似于(我知道这是无效的 C#):

  get {
        return (int[]) { 1, 2, 3, 4 };
  }
4

2 回答 2

4

如果您只想将new int[] { 1,2,3,4 }零件放入吸气剂中,那很容易...

 private static int[] _someArray = null;
 public override int[] someArray { 
     get {
          return _someArray ?? (_someArray = new int[] { 1,2,3,4 });
     }
 }

不过,你会失去只读的。

更新:泛型解决方案

或者您可以为此滥用泛型的功能:

// Of course you still want to use the non-generic class Base
abstract class Base {
    public abstract int[] someArray { get; }
}

abstract class Base<T> : Base where T: Base<T> {
     // Will be created once for every T, i.e. every derived class.
     private static int[] _someArray;

     public override int[] someArray {
        get { return _someArray ?? (_someArray = CreateArray()); }
     }

     protected abstract int[] CreateArray();
}

sealed class Derived : Base<Derived> {
     protected sealed override int[] CreateArray() { 
         return new int[] { 1,2,3,4 };
     }
}

sealed class DerivedB : Base<DerivedB> {
    protected sealed override int[] CreateArray() {
        return new int[] { 2,3,4,5 };
    }
}

请注意,这只适用于一个继承级别,所以我密封了一些东西:)

于 2012-12-14T10:38:31.457 回答
0

据我所知,这在 C# 中不起作用。您可以使用字段或在属性/方法中创建变量。在 VB.NET 中,您有Static局部变量的关键字(见下文)。

您已经评论说您有许多派生类,并且您不希望每个派生类都有一个静态字段数组。我会建议使用不同的方法。您可以在基类中使用静态变量Dictionary,并为每个派生类使用枚举:

abstract class Base
{
    public abstract DerivedType Type { get; }

    protected static readonly Dictionary<DerivedType, int[]> SomeDict;

    static Base()
    {
        SomeDict = new Dictionary<DerivedType, int[]>();
        SomeDict.Add(DerivedType.Type1, new int[] { 1, 2, 3, 4 });
        SomeDict.Add(DerivedType.Type2, new int[] { 4, 3, 2, 1 });
        SomeDict.Add(DerivedType.Type3, new int[] { 5, 6, 7 });
        // ...
    }

    public static int[] SomeArray(DerivedType type)
    {
        return SomeDict[type];
    }
}

public enum DerivedType
{
    Type1, Type2, Type3, Type4, Type5
}

class Derived : Base
{
    public override DerivedType Type
    {
        get { return DerivedType.Type1; }
    }
}

但是,在 VB.NET 中,可以使用-keyword使用静态局部变量Static

MustInherit Class Base
    Public MustOverride ReadOnly Property someArray() As Integer()
End Class

Class Derived
    Inherits Base
    Public Overrides ReadOnly Property someArray() As Integer()
        Get
            Static _someArray As Int32() = New Integer() {1, 2, 3, 4}
            Return _someArray
        End Get
    End Property
End Class

_someArray对于 的每个实例都是相同的Derived

于 2012-12-14T10:41:48.310 回答