C#中string类型的不可变性

string是C#中比较常用的字符串类型,之前一直都只是使用它,却没有深入的去了解,今天在书中忽然看到它具有不可变性;于是便仔细了解了一下。

//声明并初始化string类型变量
string Text = “Hello”;
//对string类型变量赋值
Text = “Hi”

在这里,在把Hi字符串赋给string变量Text之前 内存首先会重新初始化一块区域,并把区域的值初始化为Hi。之后,这块内存的地址将赋给变量Text,而原来存放hello的内存区域则不会改变,可以看出,string类型具有不可变性。

string类型为引用类型,string变量本身存储在栈中,而变量所指向的值则存储在托管堆中,其内存分布情况如下:

下面是具体代码分析:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace ReadOnlyOrConst
{
    class Program
    {
        static void Main(string[] args)
        {
            string numSize = "100";
            var addr = getMemory(numSize);
            Console.WriteLine("num_Size addr = " + addr);
            numSize = "101";
            addr = getMemory(numSize);
            Console.WriteLine("num_Size addr = " + addr);
            Console.ReadKey();
        }

        public static string getMemory(object o)
        {
            GCHandle h = GCHandle.Alloc(o, GCHandleType.WeakTrackResurrection);
            IntPtr addr = GCHandle.ToIntPtr(h);

            return "0x" + addr.ToString("X");
        }
    }
}

编译运行后得到结果如下图所示:

原文地址:https://www.cnblogs.com/QingYiShouJiuRen/p/10896310.html

时间: 2024-10-12 18:23:37

C#中string类型的不可变性的相关文章

Java中String类型的不可变性和驻留池

一 基本概念 可变类和不可变类(Mutable and Immutable Objects)的初步定义: 可变类:当获得这个类的一个实例引用时,可以改变这个实例的内容. 不可变类:不可变类的实例一但创建,其内在成员变量的值就不能被修改.其中String类就是不可变类的经典应用. 二 例子 package cn.xy.test; public class StringTest{ /**  * a的值在编译时就被确定下来,故其值"xy"被放入String的驻留池(驻留池在堆中)并被a指向.

Java中String类型详解

这篇博客是我一直想总结的,这两天一直比较忙,先上传下照片吧,过后有时间再弄成正常的. 本文主要是对Java中String类型的总结,包括其在JVM中是怎么存储的...

C++中string类型对象和double型变量之间的互相转换

//convert string type value to double type value string s = "23"; double d; istringstream is(s); is>>d; cout<<d<<endl;   //输出23 //convert double type value to string type value double d=45; string s; ostringstream os; os<<

java中String类型转换方法

integer to String : int i = 42;String str = Integer.toString(i);orString str = "" + idouble to String :String str = Double.toString(i);long to String :String str = Long.toString(l);float to String :String str = Float.toString(f);String to intege

Java中String对象的不可变性

首先看一个程序 package reverse; public class Reverse { public static void main(String[] args) { String c1=new String("abc"); String c2=new String("abc"); String c3=c1; System.out.println("c1==c2:"+ (c1==c2)); System.out.println(&quo

(转)Java中String类型的参数传递问题

这篇文章主要介绍了简单谈谈Java中String类型的参数传递问题的相关资料,需要的朋友可以参考下 提要:本文从实现原理的角度上阐述和剖析了:在Java语言中,以 String 作为类型的变量在作为方法参数时所表现出的“非对象”的特性. 一.最开始的示例 写代码最重要的就是实践,不经过反复试验而得出的说辞只能说是凭空遐想罢了.所以,在本文中首先以一个简单示例来抛出核心话题: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public clas

Java中String类型细节

Java中String类型细节 一 . String两种初始化方式 1 . String str1= "abc";//String类特有的创建字符对象的方式,更高效 在字符串缓冲区中检测"abc"是否存在 若存在则不重复创建,将地址赋值给str1. 若不存在,则在字符串缓冲区中创建对象并赋地址给str1. 2 . String str1= new String( "abc"); //构造函数初始化  或者  char [] ch={'a','b'

Java中String类型的参数传递问题的解析

一.引入示例 public class StringAsParamOfMethodDemo { public static void main(String[] args) { StringAsParamOfMethodDemo sapm = new StringAsParamOfMethodDemo(); sapm.testA(); } private void testA() { String originalStr = "original"; System.out.println

java中String类型

String类型是字符串类型.. 字符串一旦创建不可以在改变."abc"字符串对象一旦创建,不可以再改成"abcd" 提升字符串的访问效率:在程序中使用了"缓存"技术.所以在java中所有使用"双引号"括起来的字符串都会在"字符串常量池"中创建一份.字符串常量池在方法区中被存储. 在程序执行过程中,如果用到某个字符串,例如:"abc"那么程序救护在字符串常量池中去搜索该字符串,如果没有找