C# 入门(5) 类和结构,静态,访问器,虚成员和抽象成员,扩展方法,操作符重载,匿名类型
来源:互联网 发布:macbook软件怎么下载 编辑:程序博客网 时间:2024/06/09 20:49
C#的类和结构,静态,访问器,虚成员和抽象成员,扩展方法,操作符重载,匿名类型
参考书籍: 《C#图解教程》
【《Effective C#》提炼总结】提高Unity中C#代码质量的22条准则
在C++中,类和结构体的区别只有默认成员访问级别不同,类默认访问级别是private,而结构体是public。
在C#中,类和结构就很大不同了,从类型上看,结构是值类型,类是引用类型。下面就说一下两个类型的要点。
结构
- 因为是值类型,所以变量不能为null。
- 结构是隐式密闭的,所以不能被派生,也不能继承于类,只能实现接口。
- 结构的默认构造函数(无参构造函数)是不能在程序中声明的,也不能重定义或者删除的。但可以重载。
- 创建结构对象不一定要用new,数据成员值要先赋值才能用。
- 所有数据成员都赋值了才能使用成员函数。
- 没有析构函数。
类
构造函数(construct)
和C++构造函数要求不同,C#可以不声明或重载无参构造函数,直接声明定义有参构造函数。
析构函数(finalizer)
和C++析构函数不同,C#析构函数不会在实例超出作用域就调用。这是无法知道系统几时调用析构函数的。所以应该采用dispose模式。详见《C#图解教程》P515。
使用析构函数时一些重要的原则:
1. 不要在不需要时实现析构函数,这会严重影响性能;
2. 析构函数应该只释放对象拥有的外部资源;
3. 析构函数不应该访问其他对象,因为无法认定这些对象是否已经被销毁。
关于静态
使用静态构造函数而不是静态初始化器最常见的理由就是处理异常。在使用静态初始化器时,我们无法自己捕获异常。而在静态构造函数中却可以做到。
静态成员
结构和类都一样,常量和索引器不能声明为static。
静态构造函数
静态构造函数对于类和结构用法来说,是一样的。不存在静态析构函数。
- 只能有一个静态构造函数,而且不能带参数。
- 不能有访问修饰符。
- 不能显示调用静态构造函数,系统会自动调用,有两种情况:创建实例对象前 或者 任何静态成员被引用前。
关于访问器
get和set两个访问器在属性和索引器都有用到。
访问器的访问修饰符
- 默认情况访问器的访问级别和声明的属性或索引器的访问级别一样。
- 只有get和set访问器都有的时候,才可以修改访问器的修饰符。
- get和set访问器的修饰符只能改一个。
- 访问器的访问修饰符必须比成员的访问级别更严格的限制。
//正确案例 public string Name { get; private set; }
关于虚成员和抽象成员
WARNING!!
在构造函数中调用虚方法是极不推荐的。相当于在基类构造函数时,调用了派生类的覆写方法,也就是在派生类执行构造方法前。
关于扩展方法
操作符重载
必须声明为公有静态方法(public 和 static)。
匿名类型
类似只有变量的结构。常用于LINQ里面做查询。
- 匿名类型只能和局部变量配合使用,不能用于类成员。
- 必须用var关键字做变量类型。
- 如果编译器遇到另一个具有相同参数名,相同推断类型和相同顺序的匿名类型,它会重用这个类型并直接创建新的实例,不会创建新的匿名类型。
0 0
- C# 入门(5) 类和结构,静态,访问器,虚成员和抽象成员,扩展方法,操作符重载,匿名类型
- C#学习之静态成员和非静态成员,构造函数,方法,方法参数,操作符重载,事件
- C#之静态成员和静态方法
- C#成员访问和抽象类与接口
- 成员访问(->)操作符的重载
- C#静态类和静态类成员
- C#基础:静态成员和静态类
- C#静态类和静态成员
- C# 静态类和静态成员
- C# 静态成员和静态类
- 类中的静态成员和非静态成员(C#版)
- 静态成员函数和静态成员方法
- 静态方法和静态成员
- C#实例成员和静态成员
- C#实例成员和静态成员
- 抽象类中的 虚成员和抽象成员的比较
- 静态类和静态类成员(C# 编程指南)
- 静态类和静态类成员(C# 编程指南)
- linux mysleep实现
- ZooKeeper源码解析(四):client如何和server连接
- python连接MySQL问题
- 100. Same Tree
- [BZOJ2648]SJY摆棋子-K-D树
- C# 入门(5) 类和结构,静态,访问器,虚成员和抽象成员,扩展方法,操作符重载,匿名类型
- CSS
- ZooKeeper源码解析(五):server端如何运行
- 传输层-TCP握手释放及确认机制
- Android:ViewPager图片轮播自学
- JS 判断浏览器类型
- LeetCode 91. Decode Ways
- 存储过程的调用
- Linux之系统调度命令(redhat)