在哪里创建“const”数组

时间:2018-04-05 06:06:05

标签: c# c#-4.0

前言:我知道没有const数组

我有一个字符串数组,它们在代码中从不更改,现在只用在一个函数中。我有两个声明数组的选项:

  1. 将其设为静态:private static readonly string[] A = { "a" ,"b", "c" }
  2. 在函数内定义它:string[] A = { "a", "b", "c" }
  3. 首选哪个选项?是否存在性能差异或需要考虑的其他因素?

2 个答案:

答案 0 :(得分:7)

对于第二个选项肯定会有性能损失 - 它会创建一个新数组并在每次方法调用时初始化它。

如果您确信自己不会意外地改变阵列,我会选择第一个选项。如果您想在代码中更清楚地了解您尝试创建有效不可变的集合,可以使用:

private static readonly IReadOnlyList<string> A = new string[] { "a" ,"b", "c" };

但实际上它不会让它变得不可变 - 你必须小心不要将它传递给任何其他可能会将其强制转换回string[]并将其变异的代码。

对于真正的不变性,您可以使用Array.AsReadOnly

private static readonly IReadOnlyList<string> A =
    Array.AsReadOnly(new string[] { "a" ,"b", "c" });

当然,您可以使用不可变集合库。

(请注意,通过IReadOnlyList<string>进行的操作比直接在数组上进行操作要慢一些;在您的应用程序中,这一点是否重要将取决于您正在做什么。)

答案 1 :(得分:0)

在这种情况下,您可以使用任何情况,而不必关心性能。对于大数字,第一种选择会更快一些。 我已经执行了以下代码(使用方法中的初始化,静态只读数组和哈希集),分别为1和10百万次。

class Program
{
    static void Main(string[] args)
    {
        var watch = new System.Diagnostics.Stopwatch();
        watch.Start();

        for (int i = 0; i < 10_000_000; i++)
        {
            IsSafe("POST");
        }

        watch.Stop();
        Console.WriteLine($"Execution Time: {watch.ElapsedMilliseconds} ms");
        Console.ReadLine();
    }

    //static readonly HashSet<string> safeMethods = new HashSet<string>(new[] { "GET", "OPTIONS", "HEAD", "TRACE" });
    static readonly string[] safeMethods = new[] { "GET", "OPTIONS", "HEAD", "TRACE" };
    static bool IsSafe(string method)
    {
        //var safeMethods = new[] { "GET", "OPTIONS", "HEAD", "TRACE" };
        return safeMethods.Contains(method, StringComparer.InvariantCultureIgnoreCase);
    }
}

所有3种情况下100万的结果几乎相同-在我的笔记本电脑上约为300ms。

1000万的结果是:

static array - 3.9sec
method - 4.4sec
static hashset - 4.4sec