ahsdia
ahsdia
捕捉和处理异常
try……catch……finally
try中放的是可能出现异常的语句
catch中放的是捕捉到异常后的处理,并且catch中可以指定异常类型,当指定异常类型时,需要在catch后用括号把异常类型放进去,如果只有一个catch,表示捕捉任何类型的异常。
finally中放的是不管是否捕捉到异常都做得处理。
static void ShowList(List<int> list) //遍历列表的方法 ShowList
{
foreach(int temp in list)
{
Console.WriteLine(temp + " ");
}
}
static void Main(string[] args)
{
List<int> list = new List<int>() { 15,25,628,788,524,15};
list.Add(10); //增加数据
list.Insert(3,500); //在索引 3 前面插入数字 500 插入数据
list.Remove(15); //移除第一个 移除数据
list.Remove(15); //移除第二个
Console.WriteLine ( list.IndexOf(25)); //查询数据 所在的索引位置 第一个重复的数据
list.Sort(); //排序方法
ShowList(list); //调用遍历列表方法
Console.ReadKey();
当一片区域没有指针所指的时候会自动被回收,例如数组指向另一个数组时,原来数组将被回收
泛型方法
泛型使用原因:省去因类型不一样的重复代码,例如写一个加法类,返回类型为整形,若想用小数进行加法,则需要重新写类型。
泛型使用:class 类名<T>,类中所有要是使用到的类型换为T
dynamic类型:查阅资料C# - 解析的万金油dynamic_c# 獲取dynamic-CSDN博客
List相关函数
List.Add List.Insert
List.Remove List.Removeat
List.IndexOf()//查找下标,从前往后
List.LastIndexOf()//从后往前
List.Sort
List(列表)的相关内容
创建时没指明列表容量,则默认为4,超过4时按容量倍数扩充,例如:4、8、16···
若表面初始容量,按容量倍数扩充,例如:
List<int> l=new List<int>(10); 10、20、30···
结构体与类的关系
结构体数据直接存放在栈里,类数据存放在堆里
类的实例化对象相当于指针指向堆里的数据
运算符重载
索引器
static
修饰成员变量时:为静态成员,可以被所有的实列共享,通过类名来访问,不能通过实例对象访问
修饰方法时:只可以使用静态变量
修饰类时:类中只能包含静态变量
readonly声明只读字段,只能在声明或静态构造函数中初始化
protected权限:没有继承是与private一样,有继承时可以被子类访问
构造函数的调用
抽象类虚拟类的关系和密封类
虚拟方法和抽象方法都可以供派生类重写和都用override重写。那么它们之间有什么区别呢?
1.抽象方法使用abstract关键字,虚拟方法使用virtual关键字
2.抽象方法是可以看成是没有实现体的虚拟方法
3.虚拟方法与多态性关系密切,虚拟方法为子类提供了重写该方法的选项允许子类完全或部分重写该类的方法,必须写方法体。
4.抽象方法只是一个定义,没有提供实现部分,也就是没有{},也不要在里面写内容,需要在子类中实现,抽象方法是一种强制子类重写的方法,否则子类将不能被实例化。
5.抽象方法必须在派生类中重写,这一点跟接口类似,虚拟方法不必。
6.抽象方法不能声明方法体,而虚拟方法可以。
7.抽象类不能被实例化(不可以new),只能实例化实现了全部抽象方法的派生类;而包含虚方法的类可以实例化。
8.虚拟方法是指能被重载覆盖的方法,而抽象方法是虚拟方法中的特例,指完全没有具体实现的虚拟方法.
9.如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其它一般方法
10.抽象方法是必须被派生类覆写的方法,调用虚拟方法,运行时将确定调用对象是什么类的实例,并调用适当的覆写的方法
11.一个虚拟方法的实现可以由派生类取代。取代所继承的虚拟方法的实现的过程称为重写该方法;在一个虚拟方法调用中,该调用所涉及的那个实例的运行时类型确定了要被调用的究竟是该方法的哪一个实现。
12.抽象方法是需要子类去实现的.虚方法,是已经实现了,子类可以去覆盖,也可以不覆盖取决于需求.
————————————————
原文链接:https://blog.csdn.net/XVJINHUA954/article/details/106791595
密封类(sealed)
写法:sealed class 类名 方法名写到权限修饰符后即可
对于类,表示不能继承该类
对于方法,表示不能重写该方法
隐藏方法
若是虚方法,调用的时候会调用子类重写后的方法
若是隐藏方法,会调用父类的方法,不会调用子类的方法
class Enemy
{
public void AI()
{
Console.WriteLine("Enemy的AI");
}
}
class Boss : Enemy
{
public new void AI()
{
Console.WriteLine("Boss的AIs");
}
}
class program
{
static void Main(string[] args)
{
Enemy b = new Boss();
b.AI(); // 敌人的AI
}
}
⭐虚函数
子类可以赋值给父类
父类不可赋值给子类
1. 虚函数的特点
虚函数是面向对象语言中多态性的重要实现. 当一个函数方法在声明时, 前面带了virtual关键字, 这个函数就是一个虚函数. 它与非虚函数的主要区别在于它的实现可以在派生类中进行重写(override)(非强制要求). 重写后的函数一样也是虚函数, 当一个类或其基类中存在虚函数后就不允许出现同名, 返回值, 参数类型个数相同的非虚函数.
虚函数由于可以被子类改写的特点, 不允许设为私有(private), 同时也不能和static, override, abstract等一起使用.除了函数方法外, C#中还可以用virtual修饰属性, 索引器, 事件等等.
2. 虚函数的执行过程
当调用一个对象的一个函数时, 系统会首先去检查该对象的声明类中这个函数是不是虚函数, 如果不是虚函数就直接执行函数. 如果是虚函数的话再去检查这个对象的实例类, 看看实例类中有没有重写这个虚函数, 如果有的话就直接执行该函数, 否则就去找这个实例类的父类, 看看他的父类中有没有重写这个虚函数,有的话就执行, 没有的话就继续找直到找遍所有父类, 如果没有override关键字, 最后会执行申明类里的虚函数.
例子:
public class GoodClass
{
public virtual void GoodFunc()
{
Console.WriteLine("This is a good function!!!");
}
}
public class NiceClass : GoodClass
{
public override void GoodFunc()
{
Console.WriteLine("This is a nice function");
}
}
public class start
{
public void main()
{
GoodClass gc = new GoodClass();
gc.GoodFunc();
GoodClass nc = new NiceClass();
nc.GoodFunc();
}
}
This is a good function!!!
This is a nice function
————————————————
public class GoodClass
{
public virtual void GoodFunc()
{
Console.WriteLine("This is a good function!!!");
}
}
public class NiceClass : GoodClass
{
public override void GoodFunc()
{
Console.WriteLine("This is a nice function");
}
}
public class GreatClass : NiceClass{}
public class start
{
public void main()
{
GoodClass gc = new GreatClass();
gc.GoodFunc();
}
}
This is a nice function
————————————————
原文链接:https://blog.csdn.net/lx2054807/article/details/102703775
base.变量 访问父类成员
this.变量 访问当前类成员
访问权限
public 全局可访问(最开放)
private 只有在己类中可访问(最私密)
protected 继承类可访问