繁体   English   中英

Java和C#中的字符串

[英]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#中,数据类型可以是

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


由于字符串是引用类型,因此始终在堆中创建字符串。

像Java:

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

string alphabet = new string(letters);

并在此链接中说明了各种方法。

在.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM