《Illustrated C# 2012, 4th Edition》Daniel M. Solis 第25章 其他主题 笔记
C#中字符串是不可被修改的。
string类型有以下成员:
StringBuilder类在System.Text命名空间中定义。
StringBuilder对象的字符串是可以修改的。
StringBuilder对象的字符串通过ToString()方法获取。
预定义的简单类型都有一个Parse()和TryParse()静态方法,它可以把字符串转换为这个类型。
Parse()方法遇到不能转换为对应类型的字符串会抛出异常。
TryParse()方法遇到不能转换为对应类型的字符串返回false,它通过out参数输出转换后的数值。
值类型后跟一个问号可以创建这个值类型对应的可空值类型。
可空值类型是一个语法糖,本质上System.Nullable<T>类型的结构,因此可空值类型虽然可以赋值为null,但它仍然是值类型。
可空值类型有两个重要的只读属性HasValue和Value。
- HasValue是布尔类型,当可空值类型对象为null时,返回false,否则返回true。将可空值类型对象与null进行比较也可以判断它是不是null。
- Value是可空值类型对应的值类型,用于读取可空值类型对象的值,当可空值类型对象为null时,会抛出异常。将可空值类型对象强转为对应的值类型,同样可以访问它的值,当为null时,同样会抛出异常。
- 由结构后跟问号创建的可空值类型,外部只通过Value属性访问它的成员,无法直接访问它的成员。
值类型对象可以隐式转换为对应的可空值类型。
相同的可空值类型之间可以互相赋值。
??运算符,称为空接合运算符(null coalescing operator)。当左操作数为null时返回右操作数,否则返回左操作数。
C#支持四种形式的Main()方法,返回值类型可以是void或int,形参存在没有或为string[] args。
Main()方法必须被static修饰。
Main()方法可以是public或private,当声明为private时其他程序集无法访问。
C#支持XML文档注释,支持以下标签:
C#的类和结构支持嵌套。
嵌套类型的声明支持所有5种访问修饰符,嵌套类型的成员的声明的访问修饰符只支持public、internal、private。
嵌套类型的成员与包含这个嵌套类型的类型的成员之间的可访问性如下:
嵌套类型中的this指嵌套类型的对象。
析构函数:
- 一个类只能有一个析构函数。
- 析构函数不能有参数。
- 析构函数不能有访问修饰符。
- 析构函数不能被static修饰。
- 析构函数不能被显式调用,由GC调用。
使用析构函数的原则:
- 不需要时不应该实现析构函数,会严重影响性能。
- 析构函数应该只释放对象拥有的外部资源。
- 析构函数不应该访问其他对象,因它们可能已经被销毁。
析构函数在C# 3.0之前有时也称为终结器(finalizer)。
因为析构函数不会在超出作用域时及时调用,如果希望尽快释放非托管资源,则应该实现IDisposable接口,通过调用Dispose()方法释放非托管资源。
实现IDisposable接口的类,还应该在析构函数中调用Dispose()方法。
Dispose()方法的编写原则:
- Dispose()方法最后应该调用GC.SuppressFinalize()方法,通知CLR不要再调用析构函数。
- Dispose()方法被多次调用应该是安全的,不会抛出异常。
标准dispose模式:实现两个Dispose()方法,一个public,一个protected。protected版本接受一 个布尔参数用于区分是被析构函数调用,还是其他函数调用,具体如下:
C# 4.0为COM编程专门增加了“省略ref”特性,当调用包含ref参数的方法,却不需要接受ref参数的返回值时,实参可以无需使用ref关键字,可以不是变量。