C# String 的问题:immutable why? how? 传值?传引用?string/String?

今天突然用到C#的string,突然想起来一直没弄明白string和String有什么区别,查了一下电子书、MSDN以及百度和Google,更进一步看看String的一些问题。
0.  问题:
1. C#到底是什么时候传引用?什么时候传值?
2. String传值还是传引用
3. string和String有什么区别?
4. String为什么是Immutable,怎么实现的?
以下查询结果以及我的理解:

1. C#到底是什么时候传引用?什么时候传值?
传值的情况 :Struct、Enumeration、Numeric(Integral/Floating/decimal)、bool
传引用的情况:class、Delegate、Interface
当使用操作符"="以及函数传参数的时候:
      传值的结果是把原对象复制了一份,接收者指向原对象。
      传引用的结果是直接让接收者指向原对象。

有人说,我硬要把值当引用传怎么办?

a、用ref关键字

b、用数组,数组是class

c、凉拌:)
2. String传值还是传引用
C#的String声明是class String,当然是传引用。

不过,之所以有这个疑惑,多数是因为这个情况:

string a = "aaa";

string b = a;

b = "bbb";

或者是这么几行代码:

public void Swap(string s1, string s2)

{

string temp=s1;

s1=s2;

s2=temp;

}

这时候结果一打印,结果发现a的值还没有变,Swap也没有成功,这时候就会有幻觉:是不是没有传引用啊?

呵呵,string不会这么粗暴的打乱“声明为class就是传引用”这种规则的。

分析一下:

string a = "aaa"; //==> a----->new String("aaa")

string b = a;        //==> b----->a, 传引用

b = "bbb";          //==> b----->new String("bbb"), 传引用,b指向了一个新的字符串,a并没有变。

Swap函数也是这样,比如说传了a, b进去(a="aaa", b="bbb"),

//s1----->a, s2----->b

string temp=s1;//temp----->s1----->a

s1=s2;               //s1----->s2----->b;

s2=temp;          //s2----->temp----->a

结果是,s1和s2确实是Swap了,但是这种结果并不会影响到a和b

3. string和String有什么区别?

MSDN中对string的说明:string is an alias for String in the .NET Framework

呵呵string是String的别名而已,都是一家。

4. String为什么是Immutable,怎么实现的?
immutable:对象一旦生成不可改变

关于怎么实现的,在明白了问题2之后很好办,只要不提供任何修改自己成员变量的方法就可以了。顺便声明为sealed,防止不清楚的后来者违反规定:)

String每个看似修改了成员变量的方法,事实上都返回了一个新的String。

比如String.Replace函数,事实上并没有改变原来的串,这也是为什么只有让str = str.Replace( foo, bar )才真正完成替换的原因。

关于为什么是immutable,参见:

Why are strings immutable?

5. 更多讨论参见:

Strings in .NET and C#

Strings UNDOCUMENTED

Understanding C# Strings

why is String immutable and final? //java的,有参考价值

More On Strings: The Implementation

More on "More on Strings"

C# String 的问题:immutable why? how? 传值?传引用?string/String? - 古道西风瘦马------尉迟方高声吟唱 - 博客园

转载于:https://www.cnblogs.com/joeyliang/archive/2007/11/11/956107.html

C# String 的问题:immutable why? how? 传值?传引用?string/String? - 古道西风瘦马------尉迟方高声吟唱 - 博客园...相关推荐

  1. golang 传值 传引用 简介

    目录 1. 基础类型 2. struct 3. 函数 4. slice 5. map 6. chan 7. 总结 1. 基础类型 byte,int,bool,string,float,数组等均是传值. ...

  2. java 注解传值_java注解 - Mr.yang.localhost - 博客园

    注解使用 Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能. 注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用.包含在 java.lang. ...

  3. 几句话弄清楚Java参数传值还是传引用

    最近刷题用递归解决关于树的问题的时候,在递归函数调用的时候什么时候传入值,什么时候传入引用有疑问,因为这关系到什么时候我们需要恢复现场,什么时候不需要.在网上搜索了一下,感觉这篇总结的非常简单明了,简 ...

  4. Java传值与传引用

    基本参数类型:传值 对象类型:传引用 值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实 ...

  5. 2021-01-14python函数传参是传值还是传引用? 参数若是简单类型是传值 若是对象类型则是传引用,python是兼容两者传参方式的

    python函数传参是传值还是传引用? 首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题. ...

  6. 5个php实例,细致说明传值与传引用的区别

    传值:是把实参的值赋值给行参 ,那么对行参的修改,不会影响实参的值 传引用 :真正的以地址的方式传递参数传递以后,行参和实参都是同一个对象,只是他们名字不同而已对行参的修改将影响实参的值 说明: 传值 ...

  7. 条款22: 尽量用“传引用”而不用“传值”

    c语言中,什么都是通过传值来实现的,c++继承了这一传统并将它作为默认方式.除非明确指定,函数的形参总是通过 "实参的拷贝"来初始化的,函数的调用者得到的也是函数返回值的拷贝. 正 ...

  8. JAVA中是传值还是传引用?回答KEZHANG问题

    首先,推荐对Java有一定理解的同仁一本书<Practical Java>.在<Practical Java>中也有一个章节介绍Java中关于传值和传引用的问题,堪称经典. & ...

  9. java的函数传值_java 函数形参传值和传引用的区别[转]

    java方法中传值和传引用的问题是个基本问题,但是也有很多人一时弄不清. (一)基本数据类型:传值,方法不会改变实参的值. publicclassTestFun { publicstaticvoidt ...

最新文章

  1. 中国水处理行业深度监测及投资发展可行性分析报告2022-2027年新版
  2. 您访问的网页出错了! 网络连接异常、网站服务器失去响应_数据分析系列——静态网页爬虫进阶(requests)...
  3. 源码搭建lamp环境
  4. 计算机组成原理AB什么运算,计算机组成原理运算器实验.doc
  5. HTML基础 DOM概览(第一天)
  6. ES6新特性_ES6扩展运算符的介绍---JavaScript_ECMAScript_ES6-ES11新特性工作笔记013
  7. java 读取mysql数据库_原生Java操作mysql数据库过程解析
  8. 【Mac】789uiojklm键失效、启用小键盘(数字键盘)鼠标键的解决方法
  9. 线性代数:特征向量和特征值
  10. 【托马斯微积分】(12版)阅读笔记2:极限
  11. cmmi3级和5级之间的区别是什么?
  12. 联通pt952g 光猫管理员密码获取
  13. RecyclerView多条目加载
  14. 线性分式变换(linear fractional transformation)
  15. 微信小程序中转义字符的处理
  16. 使用计算机要遵循哪些规则,中国大学MOOC:\\\在计算机网络的定义中,把众多计算机有机连接起来要遵循规定的约定和规则,称之为( )。\\\;...
  17. 语音房间实现的一种方式
  18. CF1395A Boboniu Likes to Color Balls
  19. 制作APP没有这么难,不必望而却步
  20. 如何删除阿里云OSS云存储bucket

热门文章

  1. python中的unsqueeze()和squeeze()函数
  2. vue组件间通信三种基本方式
  3. java 商城系统架构之第三篇——集群架构搭建
  4. 上海开始采用IC卡技术加强保安人员管理
  5. 认知自己,看清时代,反思未来!21世纪的学习方法
  6. 湖南中创教育提醒校外培训留意这几点,避免维权
  7. Power BI 做动态轴
  8. Linux 内核 up down,linux同步机制之信号量down 和up
  9. webView清空历史记录失效
  10. 此计算机上无法找到autocad2017,解决安装autocad2017提示“无法定位inf文件“ACAD.inf”。”的方法...