这真的是节省分配吗?

Pos*_*Guy 2 c#

我在静态实用程序类中有以下内容:

static int[] MonthDays = new int[] {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31};
public static int[] GetListOfAllDaysForMonths()
{
    return MonthDays;
}
Run Code Online (Sandbox Code Playgroud)

现在通过在代码中的几个地方调用GetListOfAllDaysForMonths()来提高效率,我每次调用此方法时都不必分配和创建新的int []吗?

更新:让我们只读它

 static readonly int[] 
Run Code Online (Sandbox Code Playgroud)

Fre*_*örk 10

是的,但你也可以打开一些有趣的副作用.考虑一下:

int[] a = GetListOfAllDaysForMonths();
a[3] = 200;
int[] b = GetListOfAllDaysForMonths();
Console.WriteLine(b[3]);  // prints 200
Run Code Online (Sandbox Code Playgroud)

更新
鉴于预期用途(下拉列表中每日的默认数字),您将需要许多(我的意思是很多,如数十万或数百万)这样的优化列表,以产生影响.我不会花时间尝试从内存分配角度优化它; 它根本不值得.

现在,我建议你让一个方法返回一个新的int[](暴露为一个IEnumerable<int>)与每个调用的数字.然后,在以后的日子里,如果您碰巧发现这会导致内存或性能出现问题,那么您可以优化该方法.


And*_*are 6

是的,这实际上允许您重复使用相同的阵列,而不是每次都重新分配一个新阵列.

但是,由于您返回一个数组(可变),因此无法保证方法的调用者在返回数组后不会修改数组.返回一个IEnumerable<T>或者更好的方式ReadOnlyCollection<T>可以确保除了你之外没有人正在修改集合.(这与性能无关 - 我认为重要的是指出这一点.)


Pow*_*ord 6

如果这确实填充了一个下拉列表,为什么不使用DateTime的DaysInMonth静态方法来获取给定年和月的天数,然后创建一个包含这些值的数组(使用Enumerable.Range或其他一些)来填充下拉列表?

DateTime.DaysInMonth(2009, 10); // returns 31
DateTime.DaysInMonth(2009, 2); // returns 28
DateTime.DaysInMonth(2012, 2); // returns 29
DateTime.DaysInMonth(2009, 9); // returns 30
Run Code Online (Sandbox Code Playgroud)


Lee*_*Lee 5

是的,它只会被创建一次,但要注意,如果任何代码决定修改返回值,那么它将反映给所有其他调用者,因此最好每次都返回一个新副本.或者,你只能暴露IEnumerable<int>.很明显,您还可以将初始化程序替换为:

static int[] MonthDays = Enumerable.Range(1, 31).ToArray()