string 是值类型,还是引用类型(.net)
一. string 类型的用法比较像值类型
稍微有点.NET 编程知识的人都知道 string是引用类型。我为什么还有此一问?因为string的使用非常像值类型。举个例子:
string str = "abc";
Test(str);
MessageBox.Show(str);
private void Test(string str)
{
str = str + "de";
}
运行上面的代码你会发现 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");
}
或者改写为:
private void Test2(List<string> lst1)
{
List<string> lst2 = lst1;
lst2.Add("abc");
lst2.Add("de");
}
你会发现Test2已经修改了lst,使其count数变为了2。
二.string类型是只读的引用类型,修改string对象会创建新的实例
到底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对象。
转载于:https://www.cnblogs.com/51net/archive/2013/03/15/2960889.html
string 是值类型,还是引用类型(.net)相关推荐
- String 是值类型还是引用类型
System.String继承自System.Object的一个子类,所有直接或简介继承自System .ValueType的类型属于值类型,这是判断值类型与引用类型的标准. string属于引用类型 ...
- string:值类型?引用类型?[转]
string是一种很特殊的数据类型,它既是基元类型又是引用类型,在编译以及运行时,.Net都对它做了一些优化工作,正式这些优化工作有时会迷惑编程人员,使string看起来难以琢磨,这篇文章分上下两章, ...
- swift string转int_swift中结构体和类的区别(值类型和引用类型的区别)
在swift中结构体和类有着更多的相同之处,在一般的使用中能够做到互相替换.我们可以先看看官方文档的描述: Unlike other programming languages, Swift does ...
- java包装和引用_回顾值传递和引用传递关于Java是值传递还是引用传递,网上有不一样的说法。1、基本类型或基本类型的包装类以及String是值传递,引用类型是引用传递。2...
回顾值传递和引用传递 关于Java是值传递还是引用传递,网上有不一样的说法. 1.基本类型或基本类型的包装类以及String是值传递,引用类型是引用传递. 2.Java中只有值传递. 关于这个问题应该 ...
- Java值类型与引用类型的不同
[定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值,那么调用这个方法是传入的变量的值也将改变. 值类型表示复制一个当前变量传给方法,当你 ...
- C#之值类型和引用类型
本文意在巩固基础知识,并不是对其进行深入剖析,还望理解. 本文是对此项知识的整理文,有些内容来源于网络,其他为博主原创,所以难免会有一些小得瑕疵,敬请谅解. 所有示例均是博主测试过的,如有转载请标明出 ...
- 值类型与引用类型的区别
可以这样理解: 值类型保存的是具体的值 引用类型保存的是值的地址 例如 int a = 1; int b = a; b++; 这时b为2,a仍然是1 再看引用类型,例如有个类型是 User User ...
- 第2篇 C#数据类型-值类型与引用类型
一 C#内存分配 在应用程序与操作系统之间有一个"中间人"--公共语言运行时(Common Language Runtime,CLR).它为应用程序提供内`存管理,线程管理和远程处 ...
- 栈和托管堆/值类型和引用类型/强制类型转换/装箱和拆箱[C#]
一.栈和托管堆 通用类型系统(CTS)区分两种基本类型:值类型和引用类型.它们之间的根本区别在于它们在内存中的存储方式..NET使用两种不同的物理内存块来存储数据-栈和托管堆.如下图所示: 值 ...
最新文章
- python操作Mysql基础
- abap如何找屏幕增强_因增强导致BDC录屏执行异常的梗
- 操作系统(二 )| 进程管理初探(前趋图、程序执行、进程的定义特征基本状态,进程的创建终止,阻塞唤醒,挂起激活)
- ubuntu下Django环境的搭建
- 大爷去取钱,银行把取款办成存款,大爷拒绝还钱,大家怎么看?
- 索引体积_MySQL入门之索引
- 文件用户Apache shiro学习笔记+ spring整合shiro (一)
- 自动驾驶算法-滤波器系列(五)——高级运动模型在UKF中的应用
- 一线城市房价下跌 机构称年内限购难放松
- 唤醒屏幕_屏幕保护程序被困在Mac上?如何解决它
- 南天PR系列存折打印机驱动程序
- python 动物园_python面向对象 动物园 例题
- Python 学习笔记 - 函数
- Android 国内集成使用谷歌地图
- 编程中常见的Foo是什么意思
- 自动化(二)使用Python打开网页
- 组态王与网关设备的通讯(京金华TNode-M多网口网关)
- 360云盘关闭:一个360系列粉的吐槽
- 通过token窃取实现降权或者提权
- 【yolov5】检测效果测试
热门文章
- java 时间换算_【时间工具】整理下java时间换算专题
- 求素数mdp c语言问题,C语言使用深度优先搜索算法解决迷宫问题(堆栈)
- windows linux内核版本,微软决定在Windows10中发布一个完整的Linux内核
- 服务器执行sh文件或目录,将window的shell脚本通过ftp传输到Linux服务器后, shell脚本中执行时提示“没有那个文件或目录”的解决办法...
- C语言排序方法-----二分插入排序
- STM8单片机复位源判断
- Nginx——配置动静分离
- yocto添加登录用户和密码
- Tensorflow学习之 卷积神经网络 (一)什么是卷积?
- 循环神经网络(RNN)Recurrent Neural Networks