在C#中追加字符串与char之间是否有任何惩罚

Pat*_*ick 22 c#

几年前在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().