# 1.类的构造
# 类的成员:
# 1.字段:公共字段_temp ps:方法私有字段temp
# 2.属性:Temp 对字段_temp的封装 对类外
# 3.索引: 似于属性,只能作用在实例对象上
# 4.方法:
# 5.构造函数:
例子
class SampleCollection<T>
{
//字段
public string _temp;
//属性
public string Temp{get;set;};
//索引
private T[] arr = new T[100];
public T this[int i]
{
get { return arr[i]; }
set { arr[i] = value; }
}
//方法
public void SetTemp(string temp)
{
_temp = temp;
}
//构造函数
SampleCollection()
{
_temp = "temp";
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 静态类:(abstract seal)抽象密封类(不能实例和继承)
- 所有成员都是静态成员,不是所有静态成员都在静态类中
- 面对类,而不是对象
- 静态成员直接通过类名+属性名访问
- 一个静态成员改变了,其他访问到的也修改了 如所有实例公用的一个数值
# 静态构造函数:
- 只要有静态成员编译器就给静态构造函数
- 没有修饰词(默认private),无参构造函数
- 不能手动调用,是在第一次使用时调用
# 单利模式:
public class Singleton
{
private static Singleton instance;
private Singleton()
{
}
public static Singleton GetInstance()
{
if(instance==null)
{
instance=new Singleton();
}
return instance;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 类的构造函数:
- 挡一个子类继承父类以后,该子类中的所有构造函数都会先调用一次父类的构造函数
- 在没有特殊指定构造函数的时候,会调用默认的无参构造函数
- 自己加构造函数后,默认无参构造函数会没有
- 修饰public,private(一般不用)
- 构造函数不能被继承,故子类在后面加base调用父类构造函数
public student(string name, int age):base(name)
1
- 类在后面加this调用自己构造函数
public student(string name, int age,string sex, int id=0)
public student(string name, int age):this(name,age,“男”,0)
1
2
2
# 修饰符:
# 类的成员访问修饰符:
- pubilc //公共
- protected internal //子类或程序集内
- internal //程序集内
- protected //类和子类
- private //类内 (不写为private )
# 类修饰符:
- pubilc
- internal
# ==注意==访问级别约束:
1.子类不能比父类高 2.类中属性和字段不能比类高 3.方法的访问不能比参数和返回值高
# new
1)new 运算符:用于创建对象和调用构造函数。这种大家都比较熟悉,没什么好说的了。
2)new 修饰符:在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。
3)new 约束:用于在泛型声明中约束可能用作类型参数的参数的类型。
DerivedB b = new DerivedB();
b.Invoke();//调用DerivedB的Invoke方法,输出:2
Console.WriteLine(b.x.ToString());//输出DerivedB的成员x值:2
BaseA a = b;
a.Invoke();//调用BaseA的Invoke方法,输出:1
a.TrueValue = 3;//调用BaseA的属性TrueValue,修改BaseA的成员x的值
Console.WriteLine(a.x.ToString());//输出BaseA的成员x的值:3
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 局部类型 partial
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
局部类型适用于以下情况:
(1) 类型特别大,不宜放在一个文件中实现。
(2) 一个类型中的一部分代码为自动化工具生成的代码,不宜与我们自己编写的代码混合在一起。
(3) 需要多人合作编写一个类。局部类型的限制
(1) 局部类型只适用于类、接口、结构,不支持委托和枚举。
(2) 同一个类型的各个部分必须都有修饰符 partial。
(3) 使用局部类型时,一个类型的各个部分必须位于相同的命名空间中。
(4) 一个类型的各个部分必须被同时编译。
1. 局部类型的注意点
(1) 关键字partial是一个上下文关键字,只有和 class、struct、interface 放在一起时才有关键字的含义。因此partial的引入不会影响现有代码中名称为partial的变量。
(2) 局部类型的各个部分一般是分开放在几个不同的.cs文件中,但C#编译器允许我们将他们放在同一文件中。
2. 局部类型的应用特性
在局部类型上的特性具有“累加”效应。
[Attribute1, Attribute2("Hello")]
partial class Class1{}
[Attribute3, Attribute2("Exit")]
partial class Class1{}
相当于
[Attribute1, Attribute2("Hello"), Attribute3, Attribute2("Exit")]
class Class1 {}
注:Attribute2属性允许在类上多次使用。
3. 局部类型上的修饰符
(1) 一个类型的各个部分上的访问修饰符必须维持一致性。
(2) 如果一个类型有一个部分使用了abstract修饰符,那么整个类都将被视为抽象类。
(3) 如果一个类型有一个部分使用了 sealed 修饰符,那么整个类都将被视为密封类。
(4) 一个类的各个部分不能使用相互矛盾的修饰符,比如不能在一个部分上使用abstract,又在另一个部分上使用sealed。
4. 局部类型的基类和接口
(1) 一个类型的各个部分上指定的基类必须一致。某个部分可以不指定基类,但如果指定,则必须相同。
(2) 局部类型上的接口具有“累加”效应。
partial class Class2: Iinterface1, Iinterface2 {}
partial class Class2: Iinterface3 {}
partial class Class2: Iinterface2 {}
相当于
class Class2: Iinterface1, Iinterface2, Iinterface3 {}
时间会记录下一切。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 2.类的特性--类的封装,继承,多态
# 类的封装:
- 属性封装字段
- 方法的多个参数封装成一个对象
- 讲一堆代码封装到一个方法中
- 将一些功能封装到几个类中
- 一些功能相同的代码封装到一个程序集中
# 类的继承
特性:1.继承单根性,只能有一个父类2.传递性
好处:1.代码重用,类的多态
里氏替换原则:
base class基类 derived class 派生类
parent class 父类 child class 子类
parent **=new parent ()
parent **=new child ()
child ***=(child )**
或者 child ***= ** as child(不会报错 ,null)
if(** is child )判断是不是child的父类
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 类的多态:
父类方法:public virtual void say(){}
子类方法:
1.public override void say(){}
2.public new virtual void say(){} //表示添加一个全新的方法
parent 实例名=new child()
实例名.say()
1.调用子类方法,2调用父类方法
child 实例名=new child()
实例名.say()
1.调用子类方法,2调用子类方法
var 实例名=new child()
实例名.say()
1.调用子类方法,2调用子类方法
1.根据后面类型决定,2.根据前面类型决定
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 重载
1、参数类型、个数、顺序至少有一个不相同。
2、不能重载只有返回值不同的方法名。
1
2
2
# 3.异常处理
异常
try{}
catch()
{}
finaly{}
抛出异常
System. ArgumentException 参数无效时的异常
System. FileNotFoundException 访问磁盘上不存在的文件时引用的异常
System. IndexOutOfRangeException试图访问索引超出数组界限的数组元素时引发的异常
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
类型转换 →