说不尽的string字符串

本文详细解读了C#中String类型的值类型与引用类型特性,通过实例展示了如何创建、拼接、修改字符串,以及比较字符串值与引用的方法。文章特别强调了字符串对象的创建方式、驻留池原理、拼接性能优化,以及如何在列表中操作字符串对象。通过丰富的代码示例,旨在帮助开发者深入理解并高效运用C#字符串类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果你还不理解“值类型和引用类型”?如果你还经常被string字符串搞晕。请仔细阅读本文,并自己照着例子去敲代码实践,这样能够帮助你理解。本文几乎没有文字讲解,但是每一行代码都有详细的注释,思路非常清晰。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string strOne = "aaaa";//这种普通的创建方式。首先会到驻留池中寻找是否有值为“aaaa”的变量,如果有,直接引用同一个地址
            string strTwo = "aa" + "aa";//相当于直接将strTwo赋值为“aaaa”,所以与strOne引用一个地址
            Console.WriteLine(strOne == strTwo);//true
            Console.WriteLine((object)strOne == (object)strTwo);//true
            Console.WriteLine(strOne.Equals(strTwo));//true
            Console.WriteLine((object)strOne.Equals((object)strTwo));//true
 
 
            string str1 = "abc";//为“abc”放入string“驻留池”中   
            string str2 = "ab";//驻留池中放入新对象"ab"
            str2 += "c";// str2 = str2 + "c";  运行时动态创建,默认情况不加入驻留池中。虽然值也是“abc”,但不会引用str1的地址
           
            string strTemp = "ab";
            Console.WriteLine((object)str2 == (object)strTemp);//false  此时str2的值已经改变,引用也不一样
            string str3 = "abc";//直接从驻留池找到了值为“abc”的变量str1,指向相同的内存地址
           Console.WriteLine(str1 == str2);//string虽然是引用类型,但是遇到“==”运算符的时候(运算符重载),直接比较值,所以打印 true 
           Console.WriteLine((object)str1==(object)str2);//比较这两个string对象的引用   返回false
           Console.WriteLine(str1.Equals(str2));// true
           Console.WriteLine(str1==str3);//true  不解释
           Console.WriteLine((object)str1==(object)str3);//true  两个string对象  都指向相同的内存地址
 
           string str4 = new string('a', 4);//这种创建方式不会加入“驻留池”
           Console.WriteLine((object)strOne==(object)str4);//false   str4对象不放入驻留池
 
            //string类型其实是只读的,你可能会疑惑
           string str5 = "ab";
           str5 = "abcd";//str5的值确实变为了“abcd”,但是clr会重新创建一个新的对象。
 
 
 
            //string遇到“+”运算符
           string str6 = "ab";
           str6 += "c"; //str6=str6+"c"   //会重新创建一个对象
           int i = 0;
           Console.WriteLine("i" + i);//当这种情况下,string起到了连接的作用,cle会自动将“+”后面的部分执行toString()方法,转换成字符串
 
            //由于每次使用“+”拼接字符串的时候,CLR内部都会自动创建一个新的string对象,会极大的降低系统性能,所以string对象不适合做大量的字符拼接工作
           //如果需要做字符串拼接,例如常见的拼接sql语句,拼接xml/json字符串等等     推荐使用StringBuilder
             
            Person perosn = new Person("Dylan");
            List<Person> list = new List<Person>();
            list.Add(perosn);
 
            Person one = list[0];
            Person two = list[0];
            Console.WriteLine(one==two);//true
            Console.WriteLine(one.Equals(two));//true
            Console.WriteLine(object.ReferenceEquals(one,two));//true
            Console.WriteLine(one.Name);//Dylan
            one.Name = "dinglang";//对象one中的属性发生改变,list[0]指向的person对象的属性也会改变,对象two也会改变。
            Console.WriteLine(list[0].Name);//dinglang
            Console.WriteLine(one.Name);//dinglang
            Console.WriteLine(two.Name);//dinglang 
             
            Console.ReadKey();
        }
    }
 
    public class Person {
         
        private string name;
 
        public string Name
        {
            get;
            set;
        }
        public Person(string name) {
            this.Name = name;
        }
    }
}

本文出自 blog.youkuaiyun.com/dinglang_2009 ,转载请注明出处。未经本人允许,任何人不得借此牟利。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值