C# String 的问题:immutable why? how? 传值?传引用?string/String? - 古道西风瘦马------尉迟方高声吟唱 - 博客园...
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? - 古道西风瘦马------尉迟方高声吟唱 - 博客园...相关推荐
- golang 传值 传引用 简介
目录 1. 基础类型 2. struct 3. 函数 4. slice 5. map 6. chan 7. 总结 1. 基础类型 byte,int,bool,string,float,数组等均是传值. ...
- java 注解传值_java注解 - Mr.yang.localhost - 博客园
注解使用 Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能. 注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用.包含在 java.lang. ...
- 几句话弄清楚Java参数传值还是传引用
最近刷题用递归解决关于树的问题的时候,在递归函数调用的时候什么时候传入值,什么时候传入引用有疑问,因为这关系到什么时候我们需要恢复现场,什么时候不需要.在网上搜索了一下,感觉这篇总结的非常简单明了,简 ...
- Java传值与传引用
基本参数类型:传值 对象类型:传引用 值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实 ...
- 2021-01-14python函数传参是传值还是传引用? 参数若是简单类型是传值 若是对象类型则是传引用,python是兼容两者传参方式的
python函数传参是传值还是传引用? 首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题. ...
- 5个php实例,细致说明传值与传引用的区别
传值:是把实参的值赋值给行参 ,那么对行参的修改,不会影响实参的值 传引用 :真正的以地址的方式传递参数传递以后,行参和实参都是同一个对象,只是他们名字不同而已对行参的修改将影响实参的值 说明: 传值 ...
- 条款22: 尽量用“传引用”而不用“传值”
c语言中,什么都是通过传值来实现的,c++继承了这一传统并将它作为默认方式.除非明确指定,函数的形参总是通过 "实参的拷贝"来初始化的,函数的调用者得到的也是函数返回值的拷贝. 正 ...
- JAVA中是传值还是传引用?回答KEZHANG问题
首先,推荐对Java有一定理解的同仁一本书<Practical Java>.在<Practical Java>中也有一个章节介绍Java中关于传值和传引用的问题,堪称经典. & ...
- java的函数传值_java 函数形参传值和传引用的区别[转]
java方法中传值和传引用的问题是个基本问题,但是也有很多人一时弄不清. (一)基本数据类型:传值,方法不会改变实参的值. publicclassTestFun { publicstaticvoidt ...
最新文章
- 中国水处理行业深度监测及投资发展可行性分析报告2022-2027年新版
- 您访问的网页出错了! 网络连接异常、网站服务器失去响应_数据分析系列——静态网页爬虫进阶(requests)...
- 源码搭建lamp环境
- 计算机组成原理AB什么运算,计算机组成原理运算器实验.doc
- HTML基础 DOM概览(第一天)
- ES6新特性_ES6扩展运算符的介绍---JavaScript_ECMAScript_ES6-ES11新特性工作笔记013
- java 读取mysql数据库_原生Java操作mysql数据库过程解析
- 【Mac】789uiojklm键失效、启用小键盘(数字键盘)鼠标键的解决方法
- 线性代数:特征向量和特征值
- 【托马斯微积分】(12版)阅读笔记2:极限
- cmmi3级和5级之间的区别是什么?
- 联通pt952g 光猫管理员密码获取
- RecyclerView多条目加载
- 线性分式变换(linear fractional transformation)
- 微信小程序中转义字符的处理
- 使用计算机要遵循哪些规则,中国大学MOOC:\\\在计算机网络的定义中,把众多计算机有机连接起来要遵循规定的约定和规则,称之为( )。\\\;...
- 语音房间实现的一种方式
- CF1395A Boboniu Likes to Color Balls
- 制作APP没有这么难,不必望而却步
- 如何删除阿里云OSS云存储bucket
热门文章
- python中的unsqueeze()和squeeze()函数
- vue组件间通信三种基本方式
- java 商城系统架构之第三篇——集群架构搭建
- 上海开始采用IC卡技术加强保安人员管理
- 认知自己,看清时代,反思未来!21世纪的学习方法
- 湖南中创教育提醒校外培训留意这几点,避免维权
- Power BI 做动态轴
- Linux 内核 up down,linux同步机制之信号量down 和up
- webView清空历史记录失效
- 此计算机上无法找到autocad2017,解决安装autocad2017提示“无法定位inf文件“ACAD.inf”。”的方法...