关于静态方法中的new关键字的混淆

时间:2016-10-09 22:36:31

标签: c#

我正在尝试在我的程序的性能关键部分实现良好的优化。

所以我的问题是,每次因char[] abcdef关键字而致电CountAbcdef()时,new是否会重新创建?我应该把它移到外面并声明为静态吗?

private static int CountAbcdef(string s)
{
    var abcdef = new[] { 'a', 'b', 'c', 'd', 'e', 'f' };
    return s.Count(abcdef.Contains);
}

由于

3 个答案:

答案 0 :(得分:2)

每次运行方法时都会分配内存,而不是因为new关键字。以下方法与提供的方法具有完全相同的效果,并且没有新关键字。在方法结束时取消引用内存,因此内存影响最小。

private static int CountAbcdef(string s)
{
    var abcdef = { 'a', 'b', 'c', 'd', 'e', 'f' };
    return s.Count(abcdef.Contains);
}

如果要优化方法,可以将数组移到方法之外并使其保持静态。在第一次使用该类时,该阵列只会被初始化一次。要防止更改静态数组引用,请使用readonly关键字。

readonly static char[] abcdef = { 'a', 'b', 'c', 'd', 'e', 'f' };
private static int CountAbcdef(string s)
{
    return s.Count(abcdef.Contains);
}

答案 1 :(得分:2)

不要在性能关键部分使用LINQ。您可以避开overhead

private static int CountAbcdef(string s)
{
    int count = 0;
    foreach (char c in s)
        if ( c >= 'a' && c <= 'f' ) 
            count++;
    return count;
}

答案 2 :(得分:0)

你是对的,每次用这种方式调用CountAbcdef时都会初始化数组。另一种方法是创建一个静态方法初始化的静态数组,然后Count方法可以引用预先初始化的数组。

相关问题