我在静态实用程序类中有以下内容:
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>)与每个调用的数字.然后,在以后的日子里,如果您碰巧发现这会导致内存或性能出现问题,那么您可以优化该方法.
是的,这实际上允许您重复使用相同的阵列,而不是每次都重新分配一个新阵列.
但是,由于您返回一个数组(可变),因此无法保证方法的调用者在返回数组后不会修改数组.返回一个IEnumerable<T>或者更好的方式ReadOnlyCollection<T>可以确保除了你之外没有人正在修改集合.(这与性能无关 - 我认为重要的是指出这一点.)
如果这确实填充了一个下拉列表,为什么不使用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)
是的,它只会被创建一次,但要注意,如果任何代码决定修改返回值,那么它将反映给所有其他调用者,因此最好每次都返回一个新副本.或者,你只能暴露IEnumerable<int>.很明显,您还可以将初始化程序替换为:
static int[] MonthDays = Enumerable.Range(1, 31).ToArray()
| 归档时间: |
|
| 查看次数: |
234 次 |
| 最近记录: |