C#字符串小知识点

前言

大家都知道字符串是一个类,也就是说它的赋值将是引用类型的,但是想必大家都使用过,发现事情好像没有想象的如此简单,赋值的时候并没有一起改变,我们来看看究竟发生了什么。

1.字符串之间的赋值

using System;
using System.Runtime.InteropServices;

namespace StringTestPro
{
    class Program
    {

        public static string getMemory(object o) // 获取引用类型的内存地址方法
        {
            GCHandle h = GCHandle.Alloc(o, GCHandleType.Pinned);
            IntPtr addr = h.AddrOfPinnedObject();
            return "0x" + addr.ToString("X");
        }

        unsafe static void Main(string[] args)
        {
            string str_a = "is str_a";
            string str_b = str_a;
            Console.WriteLine(getMemory(str_a));
            Console.WriteLine(getMemory(str_b));
            str_a = "is str_a changed";
            Console.WriteLine(getMemory(str_a));
            Console.WriteLine(getMemory(str_b));
            Console.ReadLine();

        }
    }
}

改变str_a的值对str_b没有影响,这个确实与我们思考的引用类型正好相反,可能编程久了以后这个是理所应当,但是经过运行以后发现的结论,就在堆上分配了一个新的string对象,在初始化str_a时,引用也指向这个对象,所以str_b的值是一样。但是当现在要改变str_a的值时,并不会替换原来的值,在堆上会为新值分配一个新对象,str_b变量还是指向原来的地址,所以它的值没有改变,所以字符串之间的赋值确实时引用赋值的

2.字符串的小技巧

大家都知道使用字符串表示一个路径时,需要\\转义一下,比如"C:\\demo\\a.txt",但是我们可以在前面加上@来表示在这个字符串后的所有字符都看成原来的含义,它们不会解释为转义字符,比如@"C:\demo\a.txt",我们也可以直接在字符串前面加$符号表示字符插值格式比如$"这个是一个插值字符串{str_a}"

发布了26 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/m0_37920739/article/details/103643215