[英]Strings in Java and C#
我最近从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运算符那样强制在堆上创建此字符串? 我没有业务需要这样做,仅出于我的理解。
在C#中,总是在堆上创建字符串。 常量字符串(默认情况下)也始终处于保留状态。
您可以使用string.Intern()
强制将非常量字符串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");
在C#中,数据类型可以是
由于字符串是引用类型,因此始终在堆中创建字符串。
在.net平台中,总是在堆上创建字符串。 如果要编辑字符串,请执行以下操作:string foo =“ abc”; 字符串foo =“ abc” +“ efg”; 它将创建一个新字符串,它不会编辑前一个字符串。 前一个将从堆中删除。 但是,总而言之,它将始终在堆上创建。
在.Net 上,将在堆上创建文字字符串,并在程序启动之前将引用添加到内部池。
如果您执行诸如串联两个变量的动态操作,则会在运行时在堆上分配新的字符串:
String s = string1 + string2;
请参阅: http : //msdn.microsoft.com/library/system.string.intern.aspx
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.