C#中的字符串
classProgram
{
staticvoid Main()
{
int b = a; //将a的副本给变量b
b = 10;
Console.WriteLine(string.Format("a={0},b={1}", a, b));
Person ZS = newPerson(); //张三
Person SM = ZS; //三毛等于张三,即张三和三毛就是同一个人
Console.WriteLine(string.Format("A={0},B={1}", ZS.Age, SM.Age));
Console.ReadKey();
}
}
classPerson
{
publicint Age { get; set; }
}
相同的结构,不同的结果。
2. 何以证明string是引用类型
区分值类型与引用类型就是看它是值传递还是引用传递,如下:
using System;
classProgram
{
staticvoid Main()
{
int n = 99;
Console.WriteLine("Before:n={0}", n.GetHashCode());
//此时获取到的哈希码值就是n的变量值
GetInt(n);
string s = "Hello";
Console.WriteLine("Before:s={0}", s.GetHashCode());
GetString(s);
Console.ReadKey();
}
staticint GetInt(int n)
{
Console.WriteLine("After:m={0}", n.GetHashCode());
//传过来的是变量值,说明这是值传递
return n;
}
staticstring GetString(string s)
{
Console.WriteLine("After:s={0}", s.GetHashCode());
//传过来的是地址而不"Hello",说明这时引用传递
return s;
}
}
3. string是特殊的引用类型
为什么说string是特殊的引用类型,因为看了下面的运行结果你会很困惑,这是怎么回事呢?且看代码分析:
classProgram
{
staticvoid Main()
{
string a = "Hello ";
Console.WriteLine(a.GetHashCode());
,指向对象的值为“Hello”。
string b = a;
Console.WriteLine(b.GetHashCode());
b = "world";
Console.WriteLine(b.GetHashCode());
//string类型的值三只读的,当给他重新赋值的时候需要额外分配内存,同时地址也发生变化。这也就是string类型和一般引用类型的不同之处
//可以这么理解,字符串变量吃饭用一次性碗筷,这也是为什么在做大量字符串拼接的时候要使用StringBuilder 而不用+=
Console.WriteLine("a:"+a+"\nb:"+b);
//此时有两个地址,分别对应托管堆上两个不同的对象值
Console.ReadKey();
}
}
运行结果:

请思考下面代码的运行结果:
staticvoid Main()
{
string s = "Hello!";
ChangeStr(s);//调用方法
Console.WriteLine(s);
}
staticvoid ChangeStr(string s){s = "你好!";}
答案:?
//ChangeStr方法体内传过来的确实是引用地址,但是由于string是只读的,给他重新赋值的时候又重新分配了新地址,而对原来地址和所对应的值没有影响
那怎么定义string的值传递方法呢?
staticstring ChangeStr(refstring s)
4. string是一个变态类型
说string是特殊的引用类型是出于客气,写到这我就不能不破口大骂string是个变态狂了,Look:
classProgram
{
staticvoid Main()
{
string S1 = "Hello";
string S2 = "Hello";
bool r1 = object.ReferenceEquals(S1, S2);
var A = new { Age = 12 }; //对象A
var B = new { Age = 12 }; //对象B
bool r2 = object.ReferenceEquals(A, B);
Console.WriteLine("r1={0},r2={1}", r1, r2);
Console.ReadKey();
}
}
运行结果真的让人出乎意料,同样是引用类型,string总是和别人不一样。
消消气,理智一点分析,其实这就是string的内存驻留机制 ,也就是CLR为string做的优化(当有多个字符串变量包含了相同的值时, CLR尽可能不要重复地分配内存,而是让它们统统指向同一个字符串对象实例)。
staticvoid Main()
{
string p = "Hello";
string q = new StringBuilder().Append("Hello").ToString();
Console.WriteLine(object.ReferenceEquals(p, q));
//由于声明方式不同,所以CLR不会检查驻留池是否存在相同的变量值
Console.ReadKey();
}
staticvoid Main()
{
string p = "Hello";
string q = new StringBuilder().Append("Hello").ToString();
string o = string.Intern(q); //强制CLR检查驻留池
Console.WriteLine(object.ReferenceEquals(p, o));
Console.ReadKey();
}
---- Author:Hollson QQ:498576940
C#中的字符串的更多相关文章
- Python3中的字符串函数学习总结
这篇文章主要介绍了Python3中的字符串函数学习总结,本文讲解了格式化类方法.查找 & 替换类方法.拆分 & 组合类方法等内容,需要的朋友可以参考下. Sequence Types ...
- 使用strings查看二进制文件中的字符串
使用strings查看二进制文件中的字符串 今天介绍的这个小工具叫做strings,它实现功能很简单,就是找出文件内容中的可打印字符串.所谓可打印字符串的涵义是,它的组成部分都是可打印字符,并且以nu ...
- 在 case 语句中使用字符串-转
http://www.cnblogs.com/del/archive/2008/07/08/1237856.html 非常遗憾 Delphi 的 case 语句不支持字符串, 但我觉得这也可能是基于效 ...
- 使用Microsoft Roslyn提取C#和VB.NET源代码中的字符串常量
Microsoft Roslyn是微软.NET“编译器即服务(Compiler as a Service)”的主要产品,它提供了开放的编译器API,并为源代码产生.分析和重构提供了新一代的语言对象模型 ...
- SQL Server中截取字符串常用函数
SQL Server 中截取字符串常用的函数: .LEFT ( character_expression , integer_expression ) 函数说明:LEFT ( '源字符串' , '要截 ...
- 在文件夹中 的指定类型文件中 查找字符串(CodeBlocks+GCC编译,控制台程序,仅能在Windows上运行)
说明: 程序使用 io.h 中的 _findfirst 和 _findnext 函数遍历文件夹,故而程序只能在 Windows 下使用. 程序遍历当前文件夹,对其中的文件夹执行递归遍历.同时检查遍历到 ...
- 7.Java中的字符串
1.String的特性 特性一:不可变性 String s=new String("yangyun") s=s.toUpperCase(); 这里的s,s占用的空间是不一样的(地址 ...
- C# 利用占位符替换word中的字符串和添加图片
利用占位符替换word中的字符串和添加图片 ///<summary> /// 替换word模板文件内容,包括表格中内容 /// 调用如下:WordStr ...
- 使用C#程序处理PowerPoint文件中的字符串
最近, 有同事偶然发现Microsoft Office PowerPoint可以被看作是一个压缩包,然后通过WinRAR解压出来一组XML文件.解压出来的文件包括: 一个索引文件名称为:[Conte ...
- Java OOP中的字符串篇
字符串的三大特征: String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 一.定义 查看 API 会发现,String.St ...
随机推荐
- Oracle建表插数据等等
Oracle的表的管理: 表名和列的命名规则,详见 数据库命名规范 . 必须以字母开头 . 长度不能超过30个字符 . 不能使用Oracle的保留字 . 只能使用如下字符 column_name-Z, ...
- 转:理解 Linux 的硬链接与软链接
Linux 的文件与目录 现代操作系统为解决信息能独立于进程之外被长期存储引入了文件,文件作为进程 创建信息的逻辑单元可被多个进程并发使用.在 UNIX 系统中,操作系统为磁盘上的文本与图像.鼠标与键 ...
- 对easyUI中课堂源码编辑改进建议
在孙宇老师讲得Easyui第10讲完后,基本的增删该查做出来了,但是编辑存在一个问题:行内样式编辑修改,如果当用户没有修改数据,孙宇老师讲得时候直接return,这样做是不合理的:第二次再使用右键编辑 ...
- 【转】Mac不能复制拷贝写入文件到移动硬盘,U盘怎么办 |
原文网址:http://jingyan.baidu.com/article/a3aad71aa1dde7b1fb0096ab.html 有的小伙伴把移动硬盘或 U 盘接入到 Mac 电脑上,当把文件拷 ...
- [Tommas] UNION 和 UNION ALL 的区别
UNION指令的目的是将两个 SQL 语句的结果合并起来.从这个角度来看,UNION跟 JOIN 有些许类似,因为这两个指令都可以由多个表格中撷取资料.UNION的一个限制是两个 SQL 语句所产生的 ...
- SQL Server中CURD语句的锁流程分析
我只在数据库选项已开启“行版本控制的已提交读”(READ_COMMITTED_SNAPSHOT为ON)中进行了观察. 因此只适用于这种环境的数据库. 该类数据库支持四种不同事务隔离级别,下面分别观察数 ...
- 单调栈 二 nyOj 最大矩形和
主要思想来自 http://blog.csdn.net/wuyanyi/article/details/7243580 题目的连接,头次提交的同学需要注册 http://acm.nyist.net/J ...
- CF402E Strictly Positive Matrix 传递闭包用强连通分量判断
题目链接:http://codeforces.com/problemset/problem/402/E /**算法分析: 这道题考察了图论基本知识,就是传递闭包,可以构图用强联通分量来判断 */ #i ...
- npm 国内镜像资源 --转载
npm 是node.js 环境下的包管理器,非常强大智能. 生活这这片神奇的土地上,各种奇葩手段屡见不鲜啊. 为什么要换源? npm 官方站点 http://www.npmjs.org/ 并没有被墙, ...
- 用lambda构建ORM查询语句
本文介绍如何解析lambda表达式来获取一个满足条件的查询语句. 先看个截图 通过设置实体对象Article_Content的查询表达式,就可以获取对应的参数化SQL语句,使用起来很方便,减少了代码 ...