gpt4 book ai didi

c# - 不使用类字段返回静态数组

转载 作者:行者123 更新时间:2023-11-30 15:36:15 25 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

如果您只想将 new int[] { 1,2,3,4 } 部分放入 getter,那很容易...

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

不过,你会失去 readonly。

更新:泛型解决方案

或者您可以为此滥用泛型的特性:

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

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

关于c# - 不使用类字段返回静态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13876882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com