Java和C#中的字符串

时间:2014-03-26 11:24:50

标签: c# java .net clr

我最近从Java转移到C#,想知道我们如何显式定义存储在堆上的字符串。

例如:

在Java中,我们可以通过两种方式定义字符串:

String s = "Hello" //Goes on string pool and is interned
String s1 = new String("Hello") //creates a new string on heap

AFAIK,C#只有一种定义String的方法:

String s = "Hello" // Goes on heap and is interned

有没有办法可以强制在堆上创建这个字符串,就像我们在Java中使用new运算符一样?我没有业务需要这样做,这只是为了我的理解。

5 个答案:

答案 0 :(得分:1)

在C#中,始终在堆上创建字符串。常量字符串(默认情况下)也始终是实习的。

您可以使用string.Intern()强制使用非常量字符串进行实体化,如下面的代码所示:

string a1 = "TE";
string a2 = "ST";
string a = a1 + a2;

if (string.IsInterned(a) != null)
    Console.WriteLine("a was interned");
else
    Console.WriteLine("a was not interned");

string.Intern(a);

if (string.IsInterned(a) != null)
    Console.WriteLine("a was interned");
else
    Console.WriteLine("a was not interned");

答案 1 :(得分:0)

在C#中,数据类型可以是

  1. 值类型 - 在堆栈中创建(例如int,struct)
  2. 引用类型 - 在堆中创建(例如字符串,类)

  3. 由于字符串是引用类型,因此总是在堆中创建。

答案 2 :(得分:0)

与Java一样:

char[] letters = { 'A', 'B', 'C' }; 

string alphabet = new string(letters);

并在此link中解释了各种方式。

答案 3 :(得分:0)

在.net平台中,始终在堆上创建字符串。如果要编辑字符串保留: string foo =“abc”; string foo =“abc”+“efg”; 它会创建一个新的字符串,它不会编辑前一个字符串。前一个将从堆中删除。但是,总而言之,它将始终在堆上创建。

答案 4 :(得分:0)

在.Net上,您的文字字符串将在堆上创建,并在程序启动之前将引用添加到实习池中。

如果您执行动态操作(如连接两个变量),则会在运行时分配堆上的新字符串:

String s = string1 + string2;

请参阅:http://msdn.microsoft.com/library/system.string.intern.aspx