string引用类型解惑

先上代码:

      string b = "123";
      private void Form1_Load(object sender, EventArgs e)
      {
          Test(b);
          MessageBox.Show(b);
      }

      public void Test(string a )
      {
          a = "456";
      }

string是引用类型的,应该按引用传递, 输出结果应该是:456,正确答案却是:123

string继承自object,而不是System.ValueType(Int32这样的则是继承于System.ValueType) 。string是引用类型,毋庸置疑,但是这个特殊的类却表现出值类型的特点.

Why?搜网上原文如下:string有个显著的特点就是它的不变性,我们一旦创建了一个string,在managed heap 上为他分配了一块连续的内存空间,我们将不能以任何方式对这个string进行修改使之变长、变短、改变格式。所有对这个string进行各项操作(比如调用ToUpper获得大写格式的string)而返回的string,实际上另一个重新创建的string,其本身并不会产生任何变化。 string   对象称为不可变的(只读),因为一旦创建了该对象,就不能修改该对象的值。有的时候看来似乎修改了,实际是string经过了特殊处理,每次改变值时都会建立一个新的string对象,变量会指向这个新的对象,而原来的还是指向原来的对象,所以不会改变。这也是string效率低下的原因。

string的不变,并非说string不能改变,而是其值不能改变。当b="123"其值发生改变时,这时检查内存,发现不存在此字符串,则重新分配内存空间,存储“456”,分配a的内存地址,a是局部的,稍后GC会自动释放,而b依然指向“123”的地址。

string 还有个特殊地方,就是它内存分配的问题,在例子中b="123",这时在内存中就将“123”存下来,假如如果再创建字符串对象,其值也等于“123”,c="123",则并非再重新分配内存空间,而是将之前保存的“123”的地址赋给c的引用。

string引用类型解惑

时间: 2024-10-24 08:41:49

string引用类型解惑的相关文章

[读书笔记]C#学习笔记八:StringBuilder与String详解及参数传递问题剖析

前言 上次在公司开会时有同事分享windebug的知识, 拿的是string字符串Concat拼接 然后用while(true){}死循环的Demo来讲解.其中有提及string操作大量字符串效率低下的问题, 刚好自己之前也看过类似的问题, 于是便拿出来记录一下.本文内容: 参数传递问题剖析, string与stringbuilder详解 1,参数传递问题剖析 对于C#中的参数传递,根据参数的类型可以分为四类: 值类型参数的按值传递 引用类型参数的按值传递 值类型参数的按引用传递 引用类型参数的

值类型&引用类型,装箱&拆箱

值类型:声明一个值类型变量,会在栈上分配一个空间,空间里存储的就是变量的值引用类型:声明一个引用类型变量,会在栈中分配一个空间,存储一个引用,这个引用指向了一个托管堆. 值类型:struct,枚举,数值类型,bool类型引用类型:数组,类,接口,委托(delegate),Object,string 可以看下下面的例子 public class Person { public string Name { get; set; } public int Age { get; set; } } publ

JavaScript笔记三:引用类型

1.Object对象 创建Object对象, var person = new Object();     var person = { Person.name = "guoliang";        name : "guoliang", Person.age = 20;                age : 20 }; 另外属性名也可以使用字符串,,第二种属于对象字面量表示法 访问对象属性可以使用"."或"[ ]",当

C#学习笔记(三):值类型、引用类型及参数传递

值类型和引用类型简介 C#中存在两种数据类型,分别是值类型与引用类型,下面我们来看看这两种类型的区别. 值类型主要包括: 简单类型(如int.float.char等,注意string不是值类型): 枚举类型(enum): 结构体类型(struct): 引用类型主要包括: 类类型(如string): 数组类型(一维或多维数组): 接口类型(interface): 委托类型(delegate): 内存分布 值类型的实例大部分情况下会被存放在线程的堆栈上,由操作系统管理其在内存上的分配和释放. 引用类

你真的了解.NET中的String吗?

概述 String在任何语言中,都有它的特殊性,在.NET中也是如此.它属于基本数据类型,也是基本数据类型中唯一的引用类型.字符串可以声明为常量,但是它却放在了堆中.希望通过本文能够使大家对.NET中的String有一个深入的了解. 不可改变对象 在.NET中String是不可改变对象,一旦创建了一个String对象并为它赋值,它就不可能再改变,也就是你不可能改变一个字符串的值.这句话初听起来似乎有些不可思议,大家也许马上会想到字符串的连接操作,我们不也可以改变字符串吗?看下面这段代码: 1us

JavaScript引用类型和基本类型的区别

JavaScript变量可以用来保存的两种类型的值:基本类型值和引用类型值. 基本类型值有5种类型:undefined,null,boolean,number,string 引用类型值有两种类型:函数,对象. 基本类型值和引用类型值的特点: 1.基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中: 2.从一个变量到另一变量复制的基本类型的值,会创建这个值得一个副本: 3.引用类型的值是对象,保存在堆内存中: 4.包含引用类型的值的变量实际存上包含的并不是对象本省,而是一个指向该对象的指针

30天C#基础巩固-----值类型/引用类型,泛型,空合并操作符(??),匿名方法

一:值类型/引用类型的区别      值类型主要包括简单类型,枚举类型,和结构体类型等,值类型的实例通常被分配在线程堆栈上面变量保存的内容是实例数据本身.引用类型被分配在托管堆上,变量保存的是地址.引用类型主要包括类类型,接口类型,委托类型和字符串类型等. 关于参数传递,这里有四种:        值类型参数的按值传递:        引用类型参数按值传递: 关于string引用类型参数按值传递的特殊情况:虽然string类型也是引用类型,然而在按值传递时,传递的实参却不会因方法中形参的改变而被

js的变量——基本类型保存在栈中,引用类型保存在堆中

javascript的基本类型:Undefined,Null,Boolean,Number,String 引用类型:Object,Array,Function 基本类型值在内存中占据固定大小,被保存在栈内存中,引用类型值是对象,保存在堆内存中. Javascript的内存的生命周期对于用户来说是透明的,不开放的.在定义变量时候就完成了分配内存,使用时候是对内存的读写操作,内存的释放依赖于浏览器的垃圾回收机制. 栈(stack)和堆(heap)==> 1,栈 stack是有结构的,先进后出,存放基

C#中DataTable转化为List<T>解析

在.net项目中使用到DataTable和List<T>集合的地方较多, 泛型的好处: 它为使用c#语言编写面向对象程序增加了极大的效力和灵活性.不会强行对值类型进行装箱和拆箱,或对引用类型进行.当涉及到两者之间的转换时,就显得有些较为繁琐.这个其中的问题主要在两者的存储方式,DataTable的存储方式采用一种二维表的方式进行数据的存储操作,DataTable表示内存中数据的一个表.在List集合中,List的本质就是一个数组,则采用一种线性结构对数据进行存储. 在转换过程中,主要的问题在于