我最近从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运算符一样?我没有业务需要这样做,这只是为了我的理解。
答案 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#中,数据类型可以是
由于字符串是引用类型,因此总是在堆中创建。
答案 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