.NET源码学习 [算法2-数组与字符串的查找与匹配]( 二 )


3. 这样做的原因个人猜测可能如下:.NET是一套底层运行规范 , 其需要对所有支持的语言定义一个通用的规则(CLS通用语言规范Common Language Specification)不同语言语法的不同 , .NET通过CLS提供了公共的语法 , 不同语言经过IL的翻译生成对应的.NET语法 。如F#中的let赋值语句(let str = “.NET”;;);VB中的String(Dim 变量名 As String = “.NET”);加上现在C#中的string 。它们都是基于.NET运行的 , 所以需要有一个总纲来规范化 , 使得每个语言具有独特性的同时 , 可以实现相同或相近的功能 。因此在.NET中定义了类String , 无论时哪种语言 , 只要编译时需要使用.NET , 均须遵守其相关规范 , 将独特的风格转换为统一且通用的规范化表达 。
4. 因此 , String不是C#中的关键字 , 可以将其用作变量名 。

.NET源码学习 [算法2-数组与字符串的查找与匹配]

文章插图
(二) 有关类String
.NET源码学习 [算法2-数组与字符串的查找与匹配]

文章插图
String类位于命名空间System中 , 是一个公共密封类 , 继承了许多接口 , 其中“著名的”有:IComparable用于字符串间的比较;IEnumerable用于迭代器的遍历 。其内部包含2个属性 , 3个字段 , 1个结构(体) , 3种运算符的重载方法 , 9个构造方法和一堆其他方法(真的太多了) 。
1. 两个属性首先是索引器 , 可以发现这是一个以int为索引 , char为返回值的只读索引器 。对比其他数据类型的索引器 , 如之前文章提到的动态数组ArrayList
.NET源码学习 [算法2-数组与字符串的查找与匹配]

文章插图

.NET源码学习 [算法2-数组与字符串的查找与匹配]

文章插图
不难发现 , String中的索引器只读不能写 , 因此经常头昏会写出这样的代码:
.NET源码学习 [算法2-数组与字符串的查找与匹配]

文章插图
同时 , String类中的索引器还是一个extern属性 , 说明其支持在外部根据不同的需求重新定义新的索引器 。
.NET源码学习 [算法2-数组与字符串的查找与匹配]

文章插图

.NET源码学习 [算法2-数组与字符串的查找与匹配]

文章插图
第二个数Length属性 , 其内部包含了一个get_Length()方法 , 用于返回字符串的长度(调用的时候 , 不用在后面加括号 , 且第一个字母大写) 。
可以看到 , 这里都出现了Intrinsic和MethodImpl及其相关内容 , 这两个内容会在文末进行补充说明 。
2. 三个字段
.NET源码学习 [算法2-数组与字符串的查找与匹配]

文章插图
string.Empty用于初始化字符串为空 。这里对四种初始化方式:(省略前缀string)str = null;str = “”;str = string.Empty;str = new()进行分析 。
(1)对于str = null , 理论上这种方式不能称之为常规意义上的初始化 , 因为赋值为null并没有在堆上分配 , 仅是在栈上分配了空间 , 依然不可直接使用 , 因为变量不引用内存中的任何对象 。这种方式 , 相当于只定义了一个变量并未对其赋值 , 在使用前必须先赋值 。
(2)对于str = “”与str = string.Empty , 其初始化并在内存空间堆与栈上都进行分配 , 将其赋值为空 。其在基本用法和性能上并没有较大差异 。

经验总结扩展阅读