C#笔记
一.面向对象编程
1.1什么是⾯向对象编程?
1.2为什么使⽤⾯向对象编程?
为了让编程更加清晰,把程序中的功能进⾏模块化划分,每个模块提供特定的功能,而且每个模块都是孤立的,这种模块化编程提供了非常大的多样性,大大增加了重⽤代码的机会。
面向对象编程也叫做OOP编程 简单来说⾯向对象编程就是结构化编程,对程序中的变量结构划分,让编程更清晰。
注意:不要从字面意思理解面向对象编程
我们把类创建的变量叫做对象,那么如何创建类呢?
1.3 类是什么东⻄?
类实际上是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法。 类定义了类的每个对象(称为实例)可以包含什么数据和功能。
1.4类的定义
类中的数据和函数称为类的成员
(1)数据成员:数据成员是包含类的数据–字段,常量和事件的成员。
(2)函数成员: 函数成员提供了操作类中数据的某些功能。(方法,属性,构造方法和终结器(析构方法),运算符和索引器)
1.5类的字段和⽅法
(1)字段的声明
访问修饰符 类型 字段名称;
(2)方法的声明
访问修饰符 返回值类型 ⽅法名称(参数){
//⽅法体
}
类似于结构体的定义
struct Customer......;
1.6如何利⽤类创建对象
使⽤我们⾃定义的类声明的变量也叫做对象,这个过程也叫做实例化。
ClassName myClass = new ClassName();
其中ClassName
是我们定义的类的名字,myClass
是我们声明的变量(对象)的名字,后 面的new
是⼀个关键字,使⽤new 加上类型名()表⽰对该对象进⾏构造,如果不进⾏构 造的话,这个对象是⽆法使⽤的。
2.构造函数
我们构造对象的时候,对象的初始化过程是⾃动完成的,但是在初始化对象的过程中有的 时候需要做⼀些额外的⼯作,
声明基本的构造函数的语法就是声明⼀个和所在类同名的⽅法,但是该方法没有返回类型。
public class MyClass{
public MyClass(){
这个构造函数的函数体
}
}
当我们使⽤new
关键字创建类的时候,就会调⽤构造⽅法。
构造函数可以进⾏重载,跟普通函数重载是⼀样的规则
2.1属性的定义
属性的定义结构:
public int MyIntProp{
get{
// get code
}
set{
//set code
}
}
(1)定义属性需要名字和类型
(2)属性包含两个块 get块和set块
(3)访问属性和访问字段⼀样,当取得属性的值的时候,就会调⽤属性中的get块,所以 get块,类型需要⼀个返回值就是属性的类型;当我们去给属性设置值的时候,就会调⽤ 属性中的set块,我们可以在set块中通过value访问到我们设置的值。
3. 值类型和引用类型
3.1 类型被分为两种:值类型(整数,bool struct char ⼩数)和引⽤类型(string 数组 ⾃定义的类,内置的类)。
三.面向对象-继承
1.1继承
1.2接⼝继承:
表示⼀个类型只继承了函数的签名,没有继承任何实现代码。 在需要指定该类型具有 某些可⽤的特性时,最好使⽤这种类型的继承。
2.多重继承
⼀些语⾔(C++)⽀持所谓的 “多重继承”,即⼀个类派生自多个类。 使⽤多重继承的优点是 有争议的:⼀方面,毫⽆疑问,可 以使⽤多重继承编写⾮常复杂但很紧凑的代码。另⼀方面,使⽤多重实现继承的代码常常很难理解和调试。
如前所述,简化健壮代码的编写⼯作是 开发 C#的重要设计 ⽬标。 因此,C#不⽀持多重实现继承。 ⽽ C#允许类型派生自多个接⼝— — 多重接⼝继承。 这说明,C#类可以派⽣⾃另⼀个类和任意多个接⼝。更准确地说, System.Object
是⼀个公共的基类,所以每个 C#(除了Object类之外)都有⼀个基类,还可以有任意多个基接⼝。
2.1实现继承
如果要声明派生自另⼀个类的⼀个类,就可以使⽤下⾯的语法:
class MyDerivedClass : MyBaseclass
{
// functions and data members here
}
如果类(或 结构)也 派生自接⼝,则⽤逗号分隔列表中的基类和接⼝:
public class MyDerivedClass: MyBaseClass , IInterface1 , IInterface2
{
// etc.
}
3.虚方法
把⼀个基类函数声明为virtual
,就可以在任何派生类中重写该函数:
class MyBaseClass{
public virtual string VirtualMethod(){
return "Method is called in base class";
}
}
在派生类中重写另外⼀个函数时,要使⽤override
关键字显示声明
class MyDerivedClass:MyBaseClass{
public override string VirtualMethod(){
return "Method is called in derivedclass.";
}
}
我们在子类⾥⾯重写虚函数之后,不管在哪⾥调⽤都是调⽤重写之后的⽅法
4. 隐藏方法
如果签名相同的方法在基类和派生类中都进行了声明,但是该⽅法没有分别声明为virtual
和override
,派生类就会隐藏基类方法。(要使⽤new
关键字进行声明)
5.基类
class MyBaseClass{
public int MyMethod(){
}
}
6.派⽣类(在派生类中把基类同名的⽅法隐藏掉了)
class MyDerivedClass:MyBaseClass{
public new void MyMethod() {
}
}
抽象类 C#允许把类和函数声明为 abstract
。 抽象类不能实例化,抽象类可以包含普通函数和抽象 函数,抽象函数就是只有函数定义没有函数体。 显然,抽象函数本⾝也是虚拟的Virtua
l(只有函数定义,没有函数体实现)。
类是⼀个模板,那么抽象类就是⼀个不完整的模板,我们不能使⽤不完整的模板去构造对象。
abstract class Building{
public abstract decimal CalculateHeatingCost();
}
7.密封类和密封方法
C#允许把类和⽅法声明为 sealed
。 对于类 ,这表示不能继承该类;对于⽅法表⽰不能重写该⽅法。
sealed FinalClass {
// etc
}
7.1 什么时候使用密封类和密封⽅法?
(1)防⽌重写某些类导致代码混乱
(2)商业原因
8.修饰符
修饰符,⽤来类型或者成员的关键字。
修饰符可以指定⽅法的可见性。
(1)public
:同⼀程序集(DLL或EXE)中的任何其他代码或引⽤该程序集的其他程序集都可 以访问该类型或成员。
(2) private
: 只有同⼀类或结构中的代码可以访问该类型或成员。
(3)protected
: 只有同⼀类或结构或者此类的派⽣类中的代码才可以访问该类型或成员。
(4)internal
: 同⼀程序集中的任何代码都可以访问该类型或成员,但的代码不可以。
(5)protected internal
: 在⼀程序集中,protected internal
体现的是internal的性质;在其 他程序集中,protected internal
体现的是protected
的性质。
public
和private修饰字段和⽅法的时候,表⽰该字段或者⽅法能不能通过对象去访问,只 有public的才可以通过对象访问,private
(私有的)只能在类模板内部访问。
protected
保护的,当没有继承的时候,它的作⽤和private
是⼀样的,当有继承的时候, protected
表示可以被子类访问的字段或者⽅法
8.1类的修饰符
public class ...
class ...
前者可以在别的项⽬下访问,后者不⾏
8.2其他修饰符
1.new
隐藏继承的成员
2.abstract
使⽤abstract
修饰的类为抽象类,抽象类只能是其他类的基类,不能与sealed
、static
⼀起 使⽤。
abstract
可以修饰抽象类中的⽅法或属性,此时,⽅法或属性不能包含实现,且访问级别 不能为私有。 抽象类不能被实例化。
3. sealed
使⽤sealed
修饰的类为密封类,密封类⽆法被继承,不能和abstract
、static
⼀起使⽤。 当sealed
⽤于⽅法或属性时,必须始终与override
⼀起使⽤。
4. static
使⽤static修饰的类为静态类,静态类所有成员都必须是静态的,不能与abstract
、sealed
⼀起使⽤。 static
可以修饰⽅法、字段、属性或事件,始终通过类名⽽不是实例名称访问静态成员, 静态字段只有⼀个副本。 静态类不能被实例化。
5.Const
使⽤const关键字来声明某个常量字段或常量局部变量,必须在声明常量时赋初值。 不能与static⼀起使⽤,常量默认是static
的,常量字段只有⼀个副本。
6.readonly
使⽤readonly
关键字来声明只读字段。 只读字段可以在声明或构造函数中初始化,每个类或结构的实例都有⼀个独⽴的副本。 可以与static
⼀起使⽤,声明静态只读字段。 静态只读字段可以在声明或静态构造函数中初始化,静态常量字段只有⼀个副本。
7.virtual
virtual
关键字⽤于修饰⽅法、属性、索引器或事件声明,并使它们可以在派⽣类中被重 写。 默认情况下,⽅法是⾮虚拟的。 不能重写⾮虚⽅法。 virtual
修饰符不能与static
、abstract
、private
或override
修饰符⼀起使⽤。
8.override
要扩展或修改继承的⽅法、属性、索引器或事件的抽象实现或虚实现,必须使⽤override
修饰符。 重写的成员必须是virtual
、abstract
或override
的
四.集合类 列表List
1. 列表List的创建和使用
1.创建列表(列表可以存储任何类型的数据,在创建列表对象的时候首先要指定你要创建的这个列表要存储什么类型的)(泛型)
List scoreList = new List();
new List(){1,2,3}
new List(){"one","two"}
var scoreList = new List();
2.往列表中插入数据
scoreList.Add(12);
scoreList.Add(45);
3.如何取得列表中的数据?
列表中的数据跟数组有点相似,索引从0开始 ,可以通过索引 来访问 scoreList[0] //访问添加到列表中的第⼀个数据
2.注意容量和列表中元素个数的区别,容量是列表中⽤于存储数据的数组的⻓度通过Capacity
获取,列表中的元素是我们添加进去需要管理的数据,通过Count
获取 .
2.列表的遍历
遍历列表有两种⽅式:
(1).for循环,遍历所有的索引,通过索引访问列表中的元素
for(int i=0;i<list.Count;i++){
//循环体list[i]
}
(2).foreach遍历
foreach(int temp in list){
//依次取得list中的每⼀个元素赋值给temp,并执⾏循环体 //循环体 temp
}
2.1 操作列表的属性和⽅法
1.Capacity
获取容量大小
2.Add()
⽅法添加元素
3.Insert()
⽅法插⼊元素
4.[index]
访问元素
5.Count
属性访问元素个数
6.RemoveAt()
⽅法移除指定位置的元素
7.IndexOf()
⽅法取得⼀个元素所在列表中的索引位置 LastIndexOf()
上⾯的⽅法是从前往后搜索,这个是从后往前搜索,搜索到满足条件的 就停⽌ 上⾯的两个⽅法,如果没有找到指定元素就返回-1
8.Sort()
对列表中是元素进⾏从小到大排序