前言:我知道没有const数组
我有一个字符串数组,它们在代码中从不更改,现在只用在一个函数中。我有两个声明数组的选项:
private static readonly string[] A = { "a" ,"b", "c" }
string[] A = { "a", "b", "c" }
首选哪个选项?是否存在性能差异或需要考虑的其他因素?
答案 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