几年前在Java开发时,我了解到如果我有一个字符而不是带有一个字符的字符串,最好附加一个字符,因为VM不必对其内部字符串中的字符串值进行任何查找池.
string stringappend = "Hello " + name + ".";
string charappend = "Hello " + name + '.'; // better?
Run Code Online (Sandbox Code Playgroud)
当我开始使用C#进行编程时,我从未想过它与"VM"相同的可能性.我遇到了C#String Theory-String实习池,它说C#也有一个内部字符串池(我想如果不这样会很奇怪)所以我的问题是,
当连接到关于C#的字符串或者它只是乱码时,在附加char而不是字符串实际上有什么好处?
编辑:请忽略StringBuilder和string.Format,我更感兴趣的是为什么我会替换"." 用'.' 在代码中.我很清楚这些类和功能.
Jef*_*dge 16
如果给出一个选择,我会通过一个string
而不是一个char
调用System.String.Concat
或(等效)+
运算符.
我看到的唯一重载System.String.Concat
是字符串或对象.由于char不是字符串,因此将选择对象版本.这会导致char被装箱.在Concat验证对象引用不为null之后,它将在char上调用object.ToString.然后,在创建新的连续字符串之前,它将首先生成可怕的单字符字符串.
所以我不知道如何通过一个炭将获得任何收益.
也许有人想看看Reflector中的Concat操作,看看是否有特殊的char处理?
UPDATE
正如我所想,这个测试证实了char略慢.
using System;
using System.Diagnostics;
namespace ConsoleApplication19
{
class Program
{
static void Main(string[] args)
{
TimeSpan throwAwayString = StringTest(100);
TimeSpan throwAwayChar = CharTest(100);
TimeSpan realStringTime = StringTest(10000000);
TimeSpan realCharTime = CharTest(10000000);
Console.WriteLine("string time: {0}", realStringTime);
Console.WriteLine("char time: {0}", realCharTime);
Console.ReadLine();
}
private static TimeSpan StringTest(int attemptCount)
{
Stopwatch sw = new Stopwatch();
string concatResult = string.Empty;
sw.Start();
for (int counter = 0; counter < attemptCount; counter++)
concatResult = counter.ToString() + ".";
sw.Stop();
return sw.Elapsed;
}
private static TimeSpan CharTest(int attemptCount)
{
Stopwatch sw = new Stopwatch();
string concatResult = string.Empty;
sw.Start();
for (int counter = 0; counter < attemptCount; counter++)
concatResult = counter.ToString() + '.';
sw.Stop();
return sw.Elapsed;
}
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
string time: 00:00:02.1878399
char time: 00:00:02.6671247
Run Code Online (Sandbox Code Playgroud)
Ste*_*n C 12
几年前在Java开发时,我了解到如果我有一个字符而不是带有一个字符的字符串,最好附加一个字符,因为VM不必对其内部字符串中的字符串值进行任何查找池.
附加char
到a String
可能比附加1个字符稍快,String
因为:
append(char)
操作不必加载字符串length
,characters
数组的引用,start
偏移量,查看Java源代码String
和相关类.你可能会对引擎盖下的内容感到惊讶.
实习池与它无关.在类加载期间,字符串文字的实习仅发生一次.仅当应用程序显式调用时才会发生非文字字符串的实习String.intern()
.