Equals() 继承自object
int 比较数值
string比较静态存储区
类比较引用
类里面重写Equals,比较类里面的值
强制类型转换:(类型名字)类
Equals() 继承自object
int 比较数值
string比较静态存储区
类比较引用
类里面重写Equals,比较类里面的值
强制类型转换:(类型名字)类
使用Equals()来判断两个变量是否相同(高级版的==)
Array.Sort()方法可以进行排序
系统自带的list,如果超出范围后,会进行预处理的报错
throw 抛出异常,new,System.ArgumentOutOfRangeExcption("报错信息");
如果命名空间已有了System,则不需要加System
IndexOutOfRangeException
ArgumentOutOfRangeException
修复 IndexOutOfRangeException
:检查循环边界和集合访问逻辑。
使用 ArgumentOutOfRangeException
:在公共方法中验证参数,明确约束(如 if (param < 0) throw ...
)。
集合访问差异:List<T>
的索引器会抛出 ArgumentOutOfRangeException
(手动验证),而数组会抛出 IndexOutOfRangeException
(自动抛出)。
泛型方法使用方式类似
1、创建方法的时候加上T
public static int GetSum<T>(T a,T b){};
2、使用方法的时候指定类型
GetSum<int>(23,45);
如果是writeline一个类,或者让一个类tostring,则会打印出这个类的命名空间等信息
可以在类中重写tostring的方式,来让这个函数输出类中的变量的(因为tostring是object的类,而object是所有类的基类
泛型:泛型类、泛型方法
处理不同数据类型
使用方法:
1、在创建类的时候,使用 T来代替各种类型(例如:int、string、double等等)
class ClassA<T>{ };
2、将类中声明的变量改成T(可以是任意类型)
3、实例化的时候,指定一个类型,后面的执行就会使用这个类型来进行处理
ClassA<int> a = new ClassA<int>();
注意:课程中的例子,将两个参数相加,但实际上T类型的无法相加,所以通过转换成dynamic来处理
for循环
foreach遍历
Console.WriteLine(列表名称); 可以直接输出当前的类型的命名空间泛型等信息
列表内容有一个数组
随着往列表内添加内容,列表容量会自动扩增:0、4、8、16依次增加
把原有的数组销毁,新增一个新的数组放入(使用Array.Copy())
可以预先制定容量大小,避免重复的消耗和复制,节省性能消耗
使用Capacity来设置、获取容量
intList.Capacity = 10;
集合类和数组的区别
引用集合类的命名空间system.Collections.Generic;
List<int> listName = new List<int>(){ 放初始值 };
<> 泛型类
使用方法和数组类似
内置Count变量(计数器)
for 循环进行遍历
接口中的方法一定是public
结构体放置在栈中
类实例放在堆中
先执行父类的构造函数,再执行子类的构造函数
2025/6/28
2025/6/28
接口中不能包含函数体,即使是空的函数体也不行。
子类中用new,隐藏方法:原来父类中的方法还在。
虚函数override了之后,原来父类中的方法不存在了。
接口的继承
使用率不太高
A接口继承B接口,A接口拥有A和B的接口功能
一个类可以实现多个接口,用,分开
接口
也是一种类,只包含没有实现的方法,没有数据成员
不能有构造函数,没有字段,无法进行运算符重载
接口的所有方法都是pubilc
interface 建议取名前面加I,例如IPort
继承接口类(准确来说是实现接口),必须重写接口中所有的方法
相当于USB接口,不实现任何功能,但可以插入各种功能
添加新项-接口
直接点击小灯泡可以自动帮忙实现接口
只能继承单个类,但可以实现多个接口
直接创建接口变量
面向接口编程
接口可以直接声明一个对象。
用这个对象可以创建的多个实例。
这个对象创建的实例,这些实例都可以实现接口的功能。
以上的说法不太准确,应该是:
1、接口可以声明为变量类型,这个变量可以引用实现了该接口的类的实例
2、接口实现方式:定义接口-创建实现类(可以是多个)-实例化具体类(new)-通过接口变量来实现类
实现多态
用接口变量来调用任意一个实例
抽象隔离原则
接口的设计目的就是隐藏具体实现细节,只暴露契约(方法签名)。调用方只需知道"这个对象能飞行",而不需关心是飞机还是鸟。
运行时绑定
具体调用哪个实现,是在运行时动态决定的(根据当前引用的对象类型)。编译时只检查接口契约是否满足。
static 静态修饰符
静态变量(数据成员)
类中存在静态变量,则在各个类中内共享,存储在静态存储区中(被多个类共享,全局)
只能通过类名来访问,无法通过实例引用访问(C#和JAVA的不同)
静态函数能够调用静态变量,不能访问动态变量
静态类
只能使用静态成员(方法和数据)
无法被实例化(直接调用)
无法被继承
不能声明构造函数(可以静态构造函数)
new
abstract 和override一起使用
sealed(必须和override)
static 修饰类或数据成员
const 常量(必须初始化)
readonly(初始化或构造函数里赋值,后面无法修改)
virtual 虚方法,和override一起使用
abstract和virtual:必须强制实现、允许覆盖
internal和public,是否可以在同一个程序集(项目)内访问
类的public(默认不是),实现项目之间的共享,右键“添加项目引用”(选取其他项目,并且会自动添加依赖项)
using 命名空间;
子类的访问权限不能比父类高
先调用父类中的构造函数,再调用子类中的构造函数
public DrivedClass():base(){}
如果重载了构造函数
构造函数时候,可以使用冒号,将子类传入的参数传入父类的参数中。
传递到父类构造函数的参数不会自动赋值给子类,子类需单独处理自己的参数。