C#中string类型赋值问题

大家都知道,C#中的string是一个引用类型,String对象是存放在堆上,而不是堆栈上的,因此,当把一个字符串变量赋给另一个字符串时,会得到对内存中同一个字符串的两个引用。但是大家有没有想过,为什么修改其中一个字符串,另外一个不受影响呢?

原来,当我们把一个字符串变量赋给另一个字符串时,就会创建一个全新的String对象,就是说这个时候就会有两个对象,比如:

class StringExc
{
public static void Main()
{
string s1 = "original string";
string s2 = s1; //注意此时会创建一个新对象
Console.WriteLine( "s1 is " + s1 );
Console.WriteLine( "s2 is " + s2 );
s1 = "changed string";
Console.WriteLine( "s1 is now " + s1 );
Console.WriteLine( "s2 is now " + s2 );
}
}

输出结果为:

s1 is original string
s2 is original string
s1 is now changed string
s2 is now original string

也就是说,改变s1的值并没有对s2造成任何影响,这与我们平时所说的引用类型的行为正好相反。当用值"original string"初始化s1时,就在堆上分配了一个String对象。在初始化s2时,引用也指向这个对象,所以s2的值也是"original string"。但是现在要改变s1的值,而不是替换原来的值时,堆上就会为新值分配一个新对象。s2变量仍然指向原来的对象,所以它的值没有改变。

另外,如果我们像下面这样:

string str1 = "abc";
string str2 = "abc";

当我们用System.Object.Equals(str1,str2)比较时,返回值是true;按理说str1和str2应该指向不同的空间,应该返回false才对啊。原来Equals有三个版本:

public  override  bool  Equals(object);
public  bool  Equals(string);
public  static  bool  Equals(string,  string);

时间: 2024-11-17 02:57:06

C#中string类型赋值问题的相关文章

string-关于java中String类型参数传递的问题,谁能给我讲清楚

问题描述 关于java中String类型参数传递的问题,谁能给我讲清楚 我知道java里面参数传递是值传递,这点不用给我解释了.但是: import java.util.*; public class Test { public static void change(String s){ s="2"; } public static void main(String[] args) throws Exception{ String s="1"; change(s);

二进制-怎样读写C++中string类型的数据

问题描述 怎样读写C++中string类型的数据 问题是,怎样将C++中string类型的数据写入文件,并正确读出 我使用write函数,string类型的数据写入文件(二进制格式),但使用read缺读不出来,问题何在 解决方案 用char *读t和写,有需要再转string 解决方案二: string转化成char * 用c_str()函数 解决方案三: 直接用fstream流操作. 解决方案四: http://blog.csdn.net/hong__fang/article/details/

string-关于java中String类型汉字字符串的升序问题

问题描述 关于java中String类型汉字字符串的升序问题 本人新手,遇到一个项目问题:有若干个对象,每个对象里面都有一个String类型的姓名属性,现在要求根据姓名属性的升序将这些对象排列在List集合里,问如何将String类型的汉字升序排列.求大神 解决方案 String[] strs = {""张三(Z)""李四(L)""王五(W)""}; // 定义一个中文排序器 Comparator c = Collator.g

string-java中String类型的字符串的处理问题

问题描述 java中String类型的字符串的处理问题 String str="/mnt/sdcard/hehe.exe,/mnt/sdcard/GG.exe,/mnt/sdcard/oo.exe,/mnt/sdcard/aa.exe,/mnt/sdcard/qq.exe"; 有这么个字符串,我想取出字符串中的5个路径怎么取,意思就是: String hehe="/mnt/sdcard/hehe.exe"; String GG="/mnt/sdcard/G

Java中String类型能转成int类型吗

问题描述 Java中String类型能转成int类型吗 一个String字符串 能否像 char类型一样 转换成int值 如果可以Java中怎么写 解决方案 看你用什么预言,各种预言都有转换函数,只要符合数值型,就可以正常转换 解决方案二: double?d?=?1.233; String?s1?=?String.valueOf(d); String?s2?=?s1.substring(0,?s1.indexOf("."))?+?s1.substring(s1.indexOf(&quo

java-Java中string类型在内存机制的存储问题

问题描述 Java中string类型在内存机制的存储问题 package chapter3; public class RefAndAdd { public static void main(String[] args) { String str = ""abc""; String str1 = ""ab""; String str2 = str1 + ""c""; String str

c++中string类型的iterator到size_t类型如何转换

问题描述 c++中string类型的iterator到size_t类型如何转换 如题,string类型提供很多如substr等函数是以size_t类型为参数的,但是使用迭代器又很方便,所以有没有什么办法可以在两者之间互相转换,或者方便的一起使用? 解决方案 这个不能,可以用JAVA,用PYTHON,用C ... 啦啦啦 解决方案二: 没办法,这个不能直接转换,类型不一样. 解决方案三: size_t类型size_t类型的用途size_t 是什么类型? 解决方案四: 直接转不可能的,可以设置一个i

简单谈谈Java中String类型的参数传递问题_java

提要:本文从实现原理的角度上阐述和剖析了:在Java语言中,以 String 作为类型的变量在作为方法参数时所表现出的"非对象"的特性. 一.最开始的示例 写代码最重要的就是实践,不经过反复试验而得出的说辞只能说是凭空遐想罢了.所以,在本文中首先以一个简单示例来抛出核心话题: public class StringAsParamOfMethodDemo { public static void main(String[] args) { StringAsParamOfMethodDem

java中string 类型的对象间比较的学习笔记

在JAVA 中String 有两种不同的赋值方式 ,"="和new一个新的对象,虽然在输出时显示的内容是一样的,但数据存储的原理是不同的. String a="ab"; String b="ab"; System.out.println(a==b);//true 三句话的执行时这样的:        当把"ab"赋值给a变量时,因为是用"="直接赋值,此时"ab"作为字面量存在栈中,然后