一. 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)相关推荐

  1. String 是值类型还是引用类型

    System.String继承自System.Object的一个子类,所有直接或简介继承自System .ValueType的类型属于值类型,这是判断值类型与引用类型的标准. string属于引用类型 ...

  2. string:值类型?引用类型?[转]

    string是一种很特殊的数据类型,它既是基元类型又是引用类型,在编译以及运行时,.Net都对它做了一些优化工作,正式这些优化工作有时会迷惑编程人员,使string看起来难以琢磨,这篇文章分上下两章, ...

  3. swift string转int_swift中结构体和类的区别(值类型和引用类型的区别)

    在swift中结构体和类有着更多的相同之处,在一般的使用中能够做到互相替换.我们可以先看看官方文档的描述: Unlike other programming languages, Swift does ...

  4. java包装和引用_回顾值传递和引用传递关于Java是值传递还是引用传递,网上有不一样的说法。1、基本类型或基本类型的包装类以及String是值传递,引用类型是引用传递。2...

    回顾值传递和引用传递 关于Java是值传递还是引用传递,网上有不一样的说法. 1.基本类型或基本类型的包装类以及String是值传递,引用类型是引用传递. 2.Java中只有值传递. 关于这个问题应该 ...

  5. Java值类型与引用类型的不同

    [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值,那么调用这个方法是传入的变量的值也将改变. 值类型表示复制一个当前变量传给方法,当你 ...

  6. C#之值类型和引用类型

    本文意在巩固基础知识,并不是对其进行深入剖析,还望理解. 本文是对此项知识的整理文,有些内容来源于网络,其他为博主原创,所以难免会有一些小得瑕疵,敬请谅解. 所有示例均是博主测试过的,如有转载请标明出 ...

  7. 值类型与引用类型的区别

    可以这样理解: 值类型保存的是具体的值 引用类型保存的是值的地址 例如 int a = 1; int b = a; b++; 这时b为2,a仍然是1 再看引用类型,例如有个类型是 User User ...

  8. 第2篇 C#数据类型-值类型与引用类型

    一 C#内存分配 在应用程序与操作系统之间有一个"中间人"--公共语言运行时(Common Language Runtime,CLR).它为应用程序提供内`存管理,线程管理和远程处 ...

  9. 栈和托管堆/值类型和引用类型/强制类型转换/装箱和拆箱[C#]

    一.栈和托管堆 通用类型系统(CTS)区分两种基本类型:值类型和引用类型.它们之间的根本区别在于它们在内存中的存储方式..NET使用两种不同的物理内存块来存储数据-栈和托管堆.如下图所示:     值 ...

最新文章

  1. python操作Mysql基础
  2. abap如何找屏幕增强_因增强导致BDC录屏执行异常的梗
  3. 操作系统(二 )| 进程管理初探(前趋图、程序执行、进程的定义特征基本状态,进程的创建终止,阻塞唤醒,挂起激活)
  4. ubuntu下Django环境的搭建
  5. 大爷去取钱,银行把取款办成存款,大爷拒绝还钱,大家怎么看?
  6. 索引体积_MySQL入门之索引
  7. 文件用户Apache shiro学习笔记+ spring整合shiro (一)
  8. 自动驾驶算法-滤波器系列(五)——高级运动模型在UKF中的应用
  9. 一线城市房价下跌 机构称年内限购难放松
  10. 唤醒屏幕_屏幕保护程序被困在Mac上?如何解决它
  11. 南天PR系列存折打印机驱动程序
  12. python 动物园_python面向对象 动物园 例题
  13. Python 学习笔记 - 函数
  14. Android 国内集成使用谷歌地图
  15. 编程中常见的Foo是什么意思
  16. 自动化(二)使用Python打开网页
  17. 组态王与网关设备的通讯(京金华TNode-M多网口网关)
  18. 360云盘关闭:一个360系列粉的吐槽
  19. 通过token窃取实现降权或者提权
  20. 【yolov5】检测效果测试

热门文章

  1. java 时间换算_【时间工具】整理下java时间换算专题
  2. 求素数mdp c语言问题,C语言使用深度优先搜索算法解决迷宫问题(堆栈)
  3. windows linux内核版本,微软决定在Windows10中发布一个完整的Linux内核
  4. 服务器执行sh文件或目录,将window的shell脚本通过ftp传输到Linux服务器后, shell脚本中执行时提示“没有那个文件或目录”的解决办法...
  5. C语言排序方法-----二分插入排序
  6. STM8单片机复位源判断
  7. Nginx——配置动静分离
  8. yocto添加登录用户和密码
  9. Tensorflow学习之 卷积神经网络 (一)什么是卷积?
  10. 循环神经网络(RNN)Recurrent Neural Networks