C#笔记:object类、可枚举类型与枚举器、集合和列表的排序与比较、LINQ 语言和部分代码规范(第五次课)
object 类
- 基本方法:(所有类都可以重写这些方法)
- Equals()
默认:默认返回值与 “==” 操作符相同 - ToString()
将对象视作字符串进行输出或拼接时会自动调用 - GetType()
ps:关于“==”操作符:
- 对于数值型的对象:当两个对象数值相同时返回为 true
- 对于引用类型的对象:当两个变量指向的是同一个对象时返回为 true - Equals()
- 深浅克隆:
- 浅克隆:类似C++中浅拷贝,即调用 object 自带的 MemberWiseClone() ,对于引用类型的成员(除字符串)只使用复制其地址(仍指向同一对象)。
- 深克隆:类似C++中深拷贝,复制所有引用类型的对象,并让引用成员指向这些新的对象。
常用系统对象
- Math(不需要实例化)
- Ceiling
- Floor
- Round
- Max
- Min
- PI
- E
- Abs
- 各种数学函数:Exp、Log、Sin等等
- Random(需要实例化,默认为时钟种子)
- Next(n):0~n(不含n)之间的随机数
- NextDouble():0~1的浮点随机数
可枚举类型(Enumerable,IEnumerable<T>)与枚举器(Enumerator,IEnumerator<T>)
-
可枚举类型
- 可枚举类到其他数据类型转换
- enums.ToArray
- enums.ToList
- enums.ToDictionary
- 可枚举类的数据计算
- enums.Count
- enums.Sum(enum=>enum.attr1)
- enums.Average(enum=>enum.attr2)
- enums.FirstOrDefault()
- 可枚举类到其他数据类型转换
-
枚举器
使用 yield return,迭代器运行到该语句时就会返回一个 expression,并保留当前在代码中的位置。下次调用该迭代器函数函数时,从之前的位置重新开始执行。// ary is an entity of a class with GetEnumerator Method for (string str in ary) { /*what you want to do with str*/ } IEnumerator enumerator = ary.GetEnumerator(); while(enumerator.MoveNext()){ stirng str = enumerator.Current as string /*What you want to do with str in the iteration*/ }
集合和列表的排序与比较
- 排序的使用:
- 自动排序类型:SortedList<T>,... (插入元素后自动排序)
- 手动排序方法:Sort, Reverse(反序)
- 排序的条件实现:(元素必须可比较)
- 在(自定义)类本身实现IComparable接口(实现接口要求的CompareTo方法)
- 定义比较器,实现IComparer<T>接口,并传入Sort(比较器的实例对象)
list.Sort(new myComparer()) - 直接用Lambda表达式告诉Sort如何进行比较
list.Sort((p1, p2) => p1.Age > p1.Age)
LINQ 语言
-
使用:
- 类似SQL语言的使用方法
query1 = from enum in enums where condition1 where condition2 orderby enum.attr1, enum.attr2 [ascending/descending] select enum/enum.attr/{enum.attr1, enum.attr2}- 类似SQL语言的使用方法
query2 = enums.Where(enum=>condition1) .Where(enum=>condition2) .OrderBy(enum=>enum.attr1) .OrderByDescending(enum=>enum.attr2) -
返回值:
LINQ返回的数据类型是可枚举类型,可对结果使用可枚举类型的相关方法。
-
实现:
实现可使用LINQ语言查询的自定义类,需要时间 IEnumerable<T> 接口,实现枚举器:
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
学习作业代码规范
- 熟悉使用C#自带的集合类、列表类和可枚举类的各种方法,避免重复造轮子,如排序、遍历等。(参考上面)
- 注意类的封装性,不要向外暴露过多数据(以现实中的使用场景为参照)
如:实现 OrderService 类时,不应该将 Order 列表直接暴露给用户,而是通过提供相应方法的方式在用户权限下为用户提供查询或修改的借口。
(老师原话:将列表直接暴露个用户相当于现实中直接把公司账本丢给用户让他自己查自己改,这显然十分不安全。) - 类的组织要符合现实中的逻辑,不要实现一些不符合类本身定位的接口方法
如:对 OrderService 实现 for in 的遍历方法,虽然功能有用,但是在一般现实的逻辑上讲不通,让人匪夷所思。