更新基本 class 值,以便所有派生的 class 值也得到更新

Update Base class values so all derived classes are also updated

我希望减少我正在从事的工作的内存需求,并且 运行 解决一些派生的 classes 的问题。目前我有 4 个派生 class 继承相同的基础 class 并重写相同的方法,但是重写方法中的函数对于每个派生 class 是不同的。这有助于清理大量代码并使维护更加容易。然而,每个派生的 class 都有一个 long[,] File_Vals 全局变量,它变得非常大。以下是 classes 的设置方式。

        public class BaseClass {
            public long[,] File_Vals;
            public int Max_rows;
            
            internal void DoWork(){}
        }

        public class FirstDerivedClass : BaseClass
        {
            public DerivedClass(long[,] file_values, int max_rows)
            {
                File_Vals = file_values;
                Max_rows = max_rows
            }
            
            internal new void DoWork()
            {
                // does work stuff
            }
        }

        public class SecondDerivedClass : BaseClass
        ...

        public class Testing
        {
            FirstDerivedClass firstDerived;
            SecondDerivedClass secondDerived;
            ThirdDerivedClass thirdDerived;
            FourthDerivedClass fourthDerived;
            
            public void Setup(long[,] file_values, int max_rows)
            {
                firstDerived = new FirstDerivedClass(file_values, max_rows);
                secondDerived = new SecondDerivedClass(file_values, max_rows);
                thirdDerived = new ThirdDerivedClass(file_values, max_rows);
                fourthDerived = new FourthDerivedClass(file_values, max_rows);
            }
            ...
            
            public void DoStuff(long[,] file_values, int max_rows)
            {
                // updated versions of file_values and max_rows.
            }
        }

因此有 4 组 File_values 必须更新。有没有办法只更新 parent/Base class 从而更新其他 derived/child classes?或者有没有一种方法可以让每个 derived/child classes 都没有自己的 File_values 对象版本,并且只有其中一个是他们都可以访问的?现在 File_values 对象可以有 1200 万行,或者更多,所以内存使用是需要考虑的事情。

with this there are 4 sets of File_values that have to be updated

不,在您的问题代码中,只有一个 long[,] 的共享实例(因为数组是 reference types)和 4 个对它的引用。您可以使用下一个代码轻松检查它:

Setup(new long[1,1], 1);
Console.WriteLine(object.ReferenceEquals(firstDerived.File_Vals, secondDerived.File_Vals)); // prints True 

所以基本上你有 32*464*4 位“开销”取决于平台。

您可以使 File_Vals 字段 readonly,以防止它被分配另一个值(参考),或者,更好的是 get-only 属性.