Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >string 是值类型,还是引用类型(.net)

string 是值类型,还是引用类型(.net)

作者头像
跟着阿笨一起玩NET
发布于 2018-09-18 07:57:14
发布于 2018-09-18 07:57:14
1.6K00
代码可运行
举报
运行总次数:0
代码可运行

一. string 类型的用法比较像值类型

稍微有点.NET 编程知识的人都知道 string是引用类型。我为什么还有此一问?因为string的使用非常像值类型。举个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
string str = "abc";
 Test(str);
 MessageBox.Show(str);
private void Test(string str)
 {
      str = str + "de";
 }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
运行上面的代码你会发现 str始终是abc,这就有点像值类型。因为值类型传递的是具体的值,所以传入的参数是形参,函数内部修改形参,不影响外部的变量。引用类型可不是这样,传递的是引用不是值。所以函数内部的修改,会影响到外部。看这个例子:
  List<string> lst = new List<string>();
  Test2(lst);
  MessageBox.Show(lst.Count.ToString());
private void Test2(List<string> lst)
  {
      lst.Add("abc");
      lst.Add("de");
  }

或者改写为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void Test2(List<string> lst1)
        {
            List<string> lst2 = lst1;
            lst2.Add("abc");
            lst2.Add("de");
 
        }

你会发现Test2已经修改了lst,使其count数变为了2。

二.string类型是只读的引用类型,修改string对象会创建新的实例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
到底string类型是值类型还是引用类型?答案当然是引用类型。通过以下代码即可验证:
 string str = "abc";
 //1
 MessageBox.Show(str.GetHashCode().ToString());
 Test(str);
 //4
 MessageBox.Show(str.GetHashCode().ToString());
private void Test(string str)
 {
      //2
      MessageBox.Show(str.GetHashCode().ToString());
      str = str + "de";
      //3
      MessageBox.Show(str.GetHashCode().ToString());
  }
 可以看出 第一个提示框和第二个提示框的显示的值是一样的,说明了string传递的是引用,也就是指针(地址)。 第三个提示框的数值 和第二个提示框的值不一样。为什么是这样?
 查 MSDN 可以找到 答案:
 String 对象称为不可变的(只读),因为一旦创建了该对象,就不能修改该对象的值。看来似乎修改了 String 对象的方法实际上是返回一个包含修改内容的新 String 对象。 

str = str + "de"; 由于string不可变,连接字符串操作已经创建了一个新的string对象。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2013-03-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
第183天:引用类型和值类型
一、内存分配 1、数值型内存分配 1 <script> 2 var num1; //这个时候不进行内存分配 3 var num3=9;//分配内存 4 var num4=num3;//会不会分配 5 6 // 这里到底分配还是不分配内存?? 7 // 答案 --分配内存 彼此拥有独立的内存空间,互不影响 8 console.log(num3); 9 console.log(num4); 10 11 num3=3333
半指温柔乐
2018/09/11
4090
面向对象(四)-值类型与引用类型详解
类型被分为两种:值类型(整数,bool struct char 小数)和引用类型(string 数组 自定义的类,内置的类)。
孙寅
2020/06/02
9890
C#篇(三)——函数传参之引用类型和值类型
函数传参之值类型: 简单的值类型传参这里就不演示了,来一个含有引用类型的值类型传参实例(只是将上例中的struct改为了class,这样好做对比):
yaphetsfang
2020/07/30
9640
C#篇(三)——函数传参之引用类型和值类型
C#中Invoke的用法()
一直对invoke和begininvoke的使用和概念比较混乱,这两天看了些资料,对这两个的用法和原理有了些新的认识和理解。
vv彭
2020/12/11
2.3K0
深入.NET平台和C#编程
1-1:Microsoft.NET框架概述 a.Microsoft.NET介绍 .NET的战略目标是在任何时候(when),任何地方(where)任何工具(what)都能通过.NET的服务获得网络上的任何信息, 享受网络给人们的便捷与快乐. b..NET框架的特点 (1)它是.NET框架类库中一个重要的组成部分 (2).NET框架为我们提供了大量的类库,它是一个巨大的宝藏,.NET应用程序可以使用这些类库进行开发 (3)Visual Studio开发工具也可以使用VB.NET语言开发程序 (4).NET框架支持跨语言开发,只要是.NET框架支持的语言都可以实现相互调用和协作 c..NET框架概述 .NET框架非常强大,主要体现在以下几种: (1)提供了一个面向对象的环境变量,完全支持面向对象编程.提高软件的可复用性、可扩展性、可维护性、灵活性等。 (2)对Web应用的强大支持,如今是互联网的时代,大量的网络应用程序发挥着重要的作用。请查看:www.dell.com (3)对Web Server(Web)的支持,WebServer是.NET非常重要的内容。Hotmail和MSN登录时都要使用Hotmail的账户... (4)Visual Studio是一个世界级的开发工具,它和.NET框架配合,能够方便快捷地开发出多种.NET应用程序, 还可以进行测试、版本控制、Team开发和部署等。 1-2:.NET框架结构 a..框架结构 详细请看P11页 例如: .NET Framework .NET Framework类库 Web窗体 Web Service WinForms ASP.NET ADO.NET和XML类 基本框架类 CLR CLS CTS 如上所示:框架结构中的组件
用户1112962
2018/09/27
1.9K0
c#基础系列1---值类型和引用类型
不知不觉已经踏入坑已10余年之多,对于c#多多少少有一点自己的认识,写出来渴求同类抨击,对自己也算是个十年之痒的一个总结。
架构师修行之路
2019/07/23
8160
c#基础系列1---值类型和引用类型
装箱与值类型虽然很容易理解,但是在实际使用中,并不总是能100%用对
public struct Point { private int m_x, m_y; public Point(int x, int y) { m_x = x; m_y = y; } public override string ToString() { return string.Format("{0},{1}",
菩提树下的杨过
2018/01/22
8400
Java集合框架-Collection01-堆栈
目录 一:堆栈  二:接口 1.Collection接口 ​编辑  集合中只能添加引用类型数据 2. List接口  3. 泛型  4. 装箱、拆箱   5. ArrayList、LinkedList、Vector区别 总结:  ---- 一:堆栈 1、堆栈结构有先进后出的特点,就像弹夹一样,先进去的在后进去的低下。 2.在开发时,LinkedList集合也可以作为堆栈,队列的结构使用。 使用的方法是:调用addFirst(E e) 方法和getFirst() 方法 注意不要调用add方法,否
天蝎座的程序媛
2022/11/18
2950
Java集合框架-Collection01-堆栈
快学会这个技能-.NET API拦截技法
前言翻译自一个国外的文章,他写的更容易让人理解 - Hacking .NET – rewriting code you don’t control:
沙漠尽头的狼
2023/02/21
8310
快学会这个技能-.NET API拦截技法
集合框架【第一章】——List-使用LinkedList完成一个堆栈MyStack(为例)
1. Collection接口   1.1 集合框架的顶级接口   1.2 是Set和List的父接口   1.3 但不是Map的父接口 (如图所示)
用户10196776
2022/11/22
2270
集合框架【第一章】——List-使用LinkedList完成一个堆栈MyStack(为例)
mysql connector 如何使用_MySQL Connector/Net 的简略使用
string connStr = string.Format(“server={0};user id={1}; password={2}; database=mysql; pooling=false”, edtSrv.Text, edtUser.Text, edtPwd.Text); try { conn = new MySqlConnection(connStr); conn.Open(); // 获得数据库列表 List cmd = new List(); cmd.Add(“SHOW DATABASES”); List list = getDataList(cmd); // 清空下拉框 cBoxDBs.Items.Clear(); // 增加下拉框列表 foreach (string str in list) cBoxDBs.Items.Add(str); } catch(MySqlException ex) { MessageBox.Show(“没有找到数据库: ” + ex.Message); }
全栈程序员站长
2022/09/14
2.6K0
mysql connector 如何使用_MySQL Connector/Net 的简略使用
Java中List的详细用法
目录: list中添加,获取,删除元素; list中是否包含某个元素; list中根据索引将元素数值改变(替换); list中查看(判断)元素的索引; 根据元素索引位置进行的判断; 利用list中索引位置重新生成一个新的list(截取集合); 对比两个list中的所有元素; 判断list是否为空; 返回Iterator集合对象; 将集合转换为字符串; 将集合转换为数组; 集合类型转换; 去重复;
全栈程序员站长
2022/09/08
7560
invoke和begininvoke 区别——c#
      https://www.cnblogs.com/worldreason/archive/2008/06/09/1216127.html
vv彭
2020/12/16
2.8K0
invoke和begininvoke 区别——c#
c#值类型与引用类型区别
值类型对象的两种表示方式:未装箱和已装箱,引用类型总是处于已装箱 值类型从System.ValueType派生。该类型提供了与System.Object相同方法,但System.ValueType重写了Equals方法, 能在两个对象的自断值完全匹配的前提下返回true。比外,System.ValueType重写了GetHashCode方法,生成哈希码时,这个重写方法所用的算法会将对象的实例字段中的值考虑在内。由于这个默认实现存在性能问题,所以定义自己的值类型时应重写Equals和GetHashCode方法
莫问今朝
2019/02/25
8050
C#中值类型和引用类型及类型的转换
版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/article/details/52911145
空空云
2018/09/27
2.6K0
.NET面试题解析(01)-值类型与引用类型
3. delegate是引用类型还是值类型?enum、int[]和string呢?
莫问今朝
2018/08/31
8170
.NET面试题解析(01)-值类型与引用类型
c#基础:值类型与引用类型2
但是想下 List<int> 中的 值 到底存放在堆上 还是栈上,所以我这边拆分成5个点来梳理:
洪移潮
2024/11/27
800
结构struct(值类型)在实际应用要注意的二点:
.Net中的数据类型大致可以分为二类:一类是值类型,一类是引用类型;结构(struct)是值类型,从性能上考虑值类型更有优势(关于值类型与引用类型的详细讨论不在本文范围内,大家可以去查阅相关资料).对于一些特定场合:比如仅需要存储数据,不需要体现具体方法的时候,建议大家用struct来代替class,但在使用过程中,有几个容易被忽视的细节. 1.使用struct存储数据做为数据源,与数据显示控件绑定时: 代码如下: Code protected void Page_Load(object sender, 
菩提树下的杨过
2018/01/22
9570
.NET中的值类型与引用类型
这是一个常见面试题,值类型(Value Type)和引用类型(Reference Type)有什么区别?他们性能方面有什么区别?
AI.NET 极客圈
2019/08/09
1.9K0
再聊一次值类型和引用类型
为什么提出这样看似很浅显的问题,是因为有次我在使用ArraySegment<byte>值类型时,有感而发。
有态度的马甲
2023/04/27
3060
再聊一次值类型和引用类型
相关推荐
第183天:引用类型和值类型
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验