C#开发轻松入门
1.vs启动项目快捷键“F5”.
2.C#程序是由类组成的。声明类的关键字是class。
C#程序的入口方法是static void Main(string[] args)
3.C#中的关键字:
关键字 class ,这个关键字的用途是声明类。
关键字 namespace ,这个关键字的用途是声明“命名空间”。
关键字 using ,这个关键字的用途是导入命名空间。
关键字 static (静态的)、 void (无返回值)、 string (字符串类型)。
Main() 方法是 C# 中的特殊方法,是程序的入口,就是说,如果没有 Main ()方法,程序就无法启动。
4.C#的注释:
注释分为:单行注释、多行注释、文档注释。
单行注释的符号是2条斜线(请注意斜线的方向),2条斜线右侧的内容就是注释,左侧的代码不会受影响。
多行注释以“/*”开始,以“*/”结束,之间的内容就是注释,可以包含多行。
文档注释写在类、方法或属性(以后会学到)的前面,它的符号是3条斜线“///”。
5.C#常量
常量,顾名思义,就是“不会改变的量”。const 关键字,表明PI是一个常量,例如 const PI = 3.14;
6.C#类型转换
自动类型转换:2种不同类型的数据运算,低精度类型会自动转换为较高精度的类型。
强制类型转换:无法自动转换为我们需要的类型,可以用强制类型转换,比如上例可以这样完成:
int i=(int)3.0;
7.C#标识符命名规则
①标识符只能由英文字母、数字和下划线组成,不能包含空格和其他字符。
错误的标识符声明:string $user; //错在使用了其他字符
②变量名不能用数字开头。
错误的标识符声明:double 6h;//错在用数字开头
③不能用关键字当变量名。
错误的标识符声明:char static ;//错在用关键字static做变量名
8.C#流程图描述程序逻辑
流程图是程序步骤的图形化表示方法。流程图中包括如下符号:
以上图形中,流程线用来连接相邻的两个步骤;每一个程序都有且仅有一个开始和结束。
9.* for 循环 ( ; ; ) 中的两个分号是不能缺少的。
C#面向对象编程
1.面向对象的特性:封装、继承、多态。
2.继承
实现继承:一个类派生于另一个基类型,它拥有该基础类型的所有成员字段和函数。
语法:
class ChildClass:ParentClass
{
....
}
特殊的基类:
Object类是所有类的共同基类,它是唯一的非派生类,是继承层次结构的基础。对于其他类,父类和子类的概念都是相对的。
规则:
继承只有单继承,也就是只能继承一个父类。当然父类还可以继承自一个祖父类,直到Object类。
3.隐藏方法
我们不能删除基类中的任何成员,但是可以用与基类成员名称相同的成员来屏蔽基类成员。
语法细节
屏蔽数据成员:在派生类中声明名称和类型相同的成员。
屏蔽函数成员:在派生类中声明新的带有相同函数签名的成员。
让编译器知道:可以添加new关键字,否则会有警告。
4.虚方法和多态
一个设计原则:
面向对象编程中,都遵循一个原则:依赖倒置原则。换句话就是程序设计要依赖于抽象(Pet)类,而不依赖于具体类(Dog)。
虚方法:声明为virtual的方法就是虚方法。基类的虚方法可以在派生类中使用override进行重写。
多态:通过指向派生类的基类引用,调用虚函数,会根据引用所指向派生类的实际类型,调用派生类中的同名重写函数,便是多态。
关于虚方法的其他知识点:
(1)重写虚方法必须具有相同的可访问性,且基类方法不能是private。
(2)不能重写static方法或者非虚方法。
(3)方法、属性、索引器、事件,都可以声明为virtual或override。
5.派生类及构造函数
构造函数:派生类对象中,有一部分是基类部分,在执行派生类的构造函数体之前,将会隐式或显示调用基类构造函数。
6.抽象类和抽象方法
抽象方法:abstract public void Func();其中,abstract比virtual更进一步,虚方法可以有函数体,不可以不用重写,抽象方法没有函数体,必须要重写。
抽象成员:
(1)必须是方法、属性、事件、索引。
(2)必须用abstract修饰符标记。
(3)不能有实现代码块。
抽象类:
(1)抽象类的存在只有一个目的,就是被继承。
(2)抽象类不能实例化,用abstract修饰。
(3)抽象类可以包含抽象成员和普通成员,以及他们的任意组合。
(4)抽象类的抽象成员在派生类中需要用override关键字实现。
7.密闭类和密闭方法
密闭类:声明为sealed的类。
密闭方法:声明为sealed的方法。
为什么需要密闭?
密闭类:有些类不希望其他人通过继承来修改。
密闭方法:不希望其他人重写该方法。
密闭方法:如果一个基类方法不希望子类对其重写,就可以不声明为virtual。如果是某个派生类方法不希望子类对其重写,同时是override重写,就可以使用sealed机制。
8.接口
接口只能用来被实现,例如:
接口也是一种引用类型,例如:
实现多个接口:
9.结构和类
不同点:
(1)结构是值类型(在栈中),类是引用类型(在堆中)。
(2)结构不支持继承,类支持继承。
(3)结构不能定义默认构造函数,编译器会定义。
适用场合
结构:由于分配内存快,作用域结束即被删除,不需要垃圾回收,用于小型数据结构。但传递过程中会复制,应该使用ref提高效率。
类:用于其他的需要继承体系的场合。
10.静态成员
静态成员将被类的所有实例共享,所有实例都访问同一内存位置。
静态成员将直接通过类名访问。Dog.Num += 1;
静态函数成员:
静态函数也独立于任何实例,没有实例也可以调用。
静态函数不能访问实例成员,仅能访问其他静态成员。
静态构造函数
(1)静态构造函数用于初始化静态字段。
(2)在引用任何静态成员之前,和创建任何实例之前调用。
(3)与类同名,使用static,无参数,无访问修饰符。
11.静态类
(1)如果类只包含了静态的方法和属性,并且标识为static.
(2)静态类不能创建实例,不能被继承。
(3)可以为静态类定义一个静态构造函数。
静态类用途:
主要用于基础类库(如数学库)和扩展方法。
扩展方法:
(1)如果有源代码,直接添加一个新方法。
(2)如果不能修改但也不是密闭类,可以派生子类扩展。
(3)如果以上条件都不满足,可以使用静态类扩展方法。
总结扩展要求:
(1)扩展方法所属的类,必须是static类。
(2)扩展方法本身必须是static方法。
(3)扩展方法的第一个参数类型,必须是this + 类名。
12.装箱和拆箱
装箱:根据值类型的值,在堆上创建一个完整的引用类型对象,并返回对象的引用,是一种隐式转换。(语言自动完成)
为什么要装箱?
有时候需要将值类型转换为引用类型来进行统一的操作和统一的存储。
装箱本质:
装箱的本质就是在堆上创建了引用类型的副本,新创建的引用类型和原来的值类型相互独立。
拆箱:将装箱后的对象转换回值类型的过程,是一种显示转换(需要手动完成)。
13.自定义转换
14.重载运算符
重载运算符不能做什么?
(1)创造新运算符。
(2)改变运算符语法。
(3)冲定义运算符如何处理预定义类型。
(4)改变运算符的优先级和结核性。
15.泛型类
泛型类就是一个模子,装入类型的材料,可以造出想要的产品。
为什么需要泛型
用基类或者公共的接口,甚至是所有类的基类object,也可以实现一个Cage类,但是类型太宽泛,需要显示转换类型,并且判断真实类型是什么。
泛型类优势
什么是泛型方法
泛型方法就是方法的模型,给定具体的类型,就可以实例化出一个操作该类型的具体方法。
16.约束
什么是约束?
约束就是控制泛型这匹烈马的缰绳,缩小泛型参数的范围。
17.泛型接口
泛型接口允许我们将接口成员的参数和返回类型设置为泛型参数的接口。
18.集合
什么是集合?
集合就是一种存放多个数据的容器类型,比如之前学过的数组Array(完整的类型是System.Array).
常用集合类型:
动态数组:ArrayList、列表:List、字典:Dictionary、队列:Queue、栈:Stack。
19.委托
什么是委托?
委托就是持有一个或者多个方法的对象!并且该对象可以执行,可以传递。
声明委托类型
委托可以持有方法,那么有什么样的方法呢?
可以声明,它是一种引用类型!
delegate void ActCute();
定义委托类型的对象
既然是种类型,就可以定义该类型的对象。
ActCute actCute;
给委托对象赋值
Class Dog{
Public void WagTail(){....}
}
actCute = dog.WagTail;
使用委托类型
像调用函数一样使用委托类型。
actCute();
20. Lambda表达式
什么是匿名方法?
delegate void ActCute();
ActCute del;
del = delegate(){.....} ;
什么是Lambda表达式?
del = delegate(){...};
del = ()=>{...};
21.事件
发布者和订阅者
通知某件事情发生的,就是发布者。
对某件事情关注的,就是订阅者。
事件触发和注册
事件发生时,会通知所有关注该事件的订阅者。
想在事件发生时被通知,必须注册以表示关注。
用程序语言解释
事件发生时,通知订阅者,就是调用订阅者的注册函数。注册,就是告诉发布者调用哪一个注册函数。
用C#实现封装
未完,待续。。。。。。