字符串是不可变的

System.String一个有趣的方面是,一旦将初始值赋给字符串对象,字符数据就不能改变了。乍一看,这可能像是一个明显的谎言。因为我们总是给字符串赋新值,而且System.String类型也定义了许多用于以各种方式(大写、小写等)修改字符数据的方法。然而,如果细究背后发生的事情,就会注意到字符串类型的方法其实返回了一个按修改格式的新字符串对象。

static void StringAreImmutable()
{
// 设置初始字符串值。
string s1 = "This is my string.";
Console.WriteLine("s1 = {0}", s1);
 // 大写的s1?
string upperString = s1.ToUpper();
Console.WriteLine("upperString = {0}", upperString);
 // 不!s1还是同样的格式!
Console.WriteLine("s1 = {0}", s1);
}

查看图3-12中相关的输出,就可以验证原来的string对象(s1)在调用ToUpper()之后没有变成大写,而是返回按修改后格式的字符串副本。

 
图3-12  字符串是不可变的

如果我们使用C#赋值运算符,同样的不变性命题还是成立的。例如,注释(或删除)StringAreImmutable()中既有的代码(减少生成的CIL代码的数量),然后增加如下的代码语句:

static void StringAreImmutable()
{
string s2 = "My other string";
s2 = "New string value";
}

现在,编译应用程序,然后把程序集加载到ildasm.exe中(同样,见第1章)。双击Main()方法就能发现如图3-13所示的CIL代码。

 
图3-13  为字符串对象赋值会产生一个新的字符串对象

尽管我们还没有研究CIL底层的一些细节,但是要注意到Main()方法多次调用了ldstr(加载字符串)操作码。简而言之,CIL的ldstr操作码在托管堆上加载了一个新的字符串对象。之前包含值"My other string."的字符串对象最终会被垃圾回收。

那么,我们能从中得出什么结论呢?简单来说,字符串类型如果被滥用,它就会变得低效,并导致代码膨胀,特别是进行字符串拼接的时候。如果我们需要表示在应用程序中用到的基本字符数据,如美国社会安全号码(SSN)、姓名或简单字符串文本等,字符串数据类型就是很好的选择。

然而,如果我们正在构建使用大量文本数据的应用程序(如字处理程序),那么使用字符串类型来表示字处理就是一个糟糕的主意,因为我们最后很可能(通常是间接地)产生字符串数据不必要的副本。

### 回答1: 在 C 语言中,字符串不可的。这意味着你不能通过给字符串赋新的值来修改字符串的内容。你可以使用函数来构造新的字符串,但是你不能直接改已经存在的字符串。 例如,你不能这样写代码: ``` char *str = "hello"; str[0] = 'H'; // 这是不允许的 ``` 如果你想要修改字符串的内容,你可以使用一个字符数组来存储字符串,并且可以通过给字符数组的元素赋新值来修改字符串的内容。例如: ``` char str[] = "hello"; str[0] = 'H'; // 这是允许的 ``` 你也可以使用字符指针来存储字符串,但是你必须在动态分配内存后才能修改字符串的内容。例如: ``` char *str = (char *) malloc(6); strcpy(str, "hello"); str[0] = 'H'; // 这是允许的 ``` ### 回答2: C语言中的字符串不可的。 在C语言中,字符串是由字符数组表示的,以null字符('\0')作为结束符。一旦字符串被定义并赋值,它的内容就不能被修改。 当我们需要修改字符串内容时,实际上是通过创建一个新的字符串来替换原有的字符串。C语言中没有提供直接修改字符串内容的方法。 例如,如果我们想将一个字符串的所有字符转为大写,我们需要先创建一个新的字符数组来存放转换后的结果。不能直接在原字符串上修改。 这是因为C语言中,字符串存储在内存的只读区域,修改字符串内容可能会导致内存错误,甚至程序崩溃。 要想在C语言中修改字符串内容,我们可以使用指针来操作字符数组。通过指针可以改字符数组中的具体字符,但不能改字符串的长度。 总结来说,C语言中的字符串不可的,一旦定义并赋值,其内容不能被修改。如果需要修改字符串内容,可以通过创建一个新的字符串来实现。 ### 回答3: 在C语言中,字符串不可的。这意味着一旦字符串被定义并初始化后,其内容就不可以被改。在C语言中,字符串常常被定义为字符数组,且以空字符'\0'作为结尾。这个空字符表示字符串的结束,且在字符串的末尾占据一个额外的位置。 由于字符串不可的,不能直接通过修改字符串数组来改字符串的内容。如果想要修改字符串的值,必须重新定义一个新的字符串,并将新的值复制给它。C语言提供了一些库函数来方便字符串操作,如strcpy()用于将一个字符串复制到另一个字符串中,strcat()用于将一个字符串追加到另一个字符串的末尾,等等。 需要注意的是,虽然C语言中的字符串不可的,但可以通过修改字符数组中的单个字符来改字符串的某个位置的值。但是这种修改方式并不符合字符串的定义和常规用法,因为它会打破字符串的结构和安全性。 总之,在C语言中,字符串不可的,修改字符串的值需要重新定义一个新的字符串
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值