1. 类和结构
2. 类
类包括成员,成员可以是静态或实例成员。
静态成员属于类;实例成员属于对象。
静态字段的值对每个对象都是相同的;每个对象的实例字段都可以有不同的值。
成员种类包括字段,常量,方法,属性,构造函数,索引器(允许对象用访问数组的方式访问),运算符,事件,析构函数,类型(类可以包含内部类)。
3. 结构
4.按值和按引用传递参数
- 按值传递:方法中的变量a得到堆栈中变量a1的一个副本。在方法最后修改、销毁副本a,a1的内容从不改变。
- 按引用传递:方法中的变量a把堆上的同一个对象引用为变量a1。当方法中修改a,则a1内容改变,因为它们是同一个对象。
(1) ref参数
- 通过引用传递结构:如果A是结构类型,添加ref参数引用传递变量;在调用端也添加ref参数。
- 类类型使用ref:传递对引用的引用(在C++术语中,即一个指向指针的指针),允许分配一个新对象。
- 变量必须在传递给方法之前初始化。
(2) out参数
5.可空类型
前提:引用类型的变量可以为空null,而值类型的变量不能。因此C#采用可空类型(类型后加?)定义可以为空的值类型。
类型与可空类型的转换:使用可空类型的HasValue和Value属性。
- HasValue返回true或false,取决于可空类型是否有值。
- Value返回底层的值。
1 int? x1 = 1; //可空类型 2 int x2 = x1.HasValue ? x1.Value : -1; 3 int x3 = x1 ?? -1; //合并操作符
6.枚举:是值类型,包含一组命名的常量。
- enum默认类型是int,可改为其他整型类型(byte、short、int、long和无符号变量);从0开始递增,可以改为其他值。
- 使用强制类型转换,将数字改为枚举,把枚举改为数字。
- 使用Enum.TryParse<T>()泛型方式获得枚举值
- 使用Enum.GetNames(typeof(枚举))遍历所有枚举名
- 使用Enum.GetValues(typeof(枚举))遍历所有枚举值
- 可以把多个选项分配给一个变量。
- 要求常量值为不同的位,可采用十六进制0x指定不同的位。
- 使用Flags属性,即“指示可以将枚举作为位域(即一组标志)处理”
// 结合单个位来包括多个值 [Flags] public enum DaysOfWeek { Monday = 0x1, Tuesday = 0x2, Wednesday = 0x4, Thursday = 0x8, Friday = 0x10, Saturday = 0x20, Sunday = 0x40, Weekend = Saturday | Sunday, Workday = 0x1f, AllWeek = Workday | Weekend } // 可以使用逻辑或运算符为一个变量指定多个值 DaysOfWeek mondayAndWednesday = DaysOfWeek.Monday | DaysOfWeek.Wednesday; WriteLine(mondayAndWednesday); DaysOfWeek weekend = DaysOfWeek.Saturday | DaysOfWeek.Sunday; WriteLine(weekend); DaysOfWeek workday = DaysOfWeek.Monday | DaysOfWeek.Tuesday | DaysOfWeek.Wednesday | DaysOfWeek.Thursday | DaysOfWeek.Friday; WriteLine(workday);
运行结果为:
7. 部分类
- partial关键字允许把类、结构、方法或接口放在多个文件中。
- partial放在class、struct或interface 关键字的前面
- 编译时会将所有部分类合并为一个类,属性、XML注释、接口、泛型类型的参数属性和成员均会合并。
- 部分类中可以包括部分方法
- 部分方法可以在部分类中进行声明,不需要实现。
- 部分方法的实现,可以放在部分类的任何其他地方。
- 部分方法未实现,编译器将删除这个方法的调用。
- 部分方法必须是void
8. 扩展方法:给对象添加功能的一种方法之一,在不能使用继承时可采用(如类是密封的)
- 必须是静态方法,它是类的一部分,但是没有放在类的源代码中
- 使用this关键字和第一个参数来扩展,第一个参数定义了扩展的类型
// 扩展方法:统计字符串单词个数 public static class StringExtensions { public static int GetWordCount(this string s) => s.Split().Length; } // 使用扩展方法 string fox = "the quick brown fox jumped over the lazy dogs down 9876543210 times"; int wordCount = fox.GetWordCount(); WriteLine($"{wordCount} words");
9. Object类:提供公有的和受保护的成员方法
- ToString()
- GetHashCode():若对象放在名为映射(也称为散列表或字典)的数据结构中,可使用该方法确定把对象放在结构的什么地方。
- Equals()(两个版本)和ReferenceEquals()
- Finalize():在引用对象作为垃圾被回收以清理资源时调用。对未托管资源的引用被删除时使用,一般要重写。
- GetType():提供对象成员所属类的基本类型、方法、属性等,以及.NET的反射技术的入口点。
- MemberwiseClone():用于复制对象,并返回对副本的一个引用(对于值类型,就是一个装箱的引用)。