人确认微软微软微软微软
人确认微软微软微软微软
Argument
列表内部数据是使用数组进行储存的,一个空的列表内部会有一个长度为0的数组,当给列表中添加元素的时候,列表容量会扩大为4,如果添加第五个的时候列表的大小会重新设置为8,方式是创建一个容量为8的容量,复制容量为4的内容放到8里面加上新增容量,完成后删除原本为4容量的数组。如果添加第九个元素,列表容量会扩大为16(是成本增加的)当列表中的容量发生改变的时候,他会创建一个新的数组,使用Arry,copy()方法将就数组中的元素复制到新的数组中,为了节省时间,如果事先知道要存储的数据的个数,就可以利用列表构造函数指定列表容量大小,比如下面的List<int> Z=new List<int>(10);创建了一个容量为10的列表,当容量不够用的时候,每次都会按照原来容量的2倍进行扩容。我们可以通过Capacity属性获取和设置容量 intList.Capaity=100;
2,注意容量和列表中元素个数的区别,容量是列表中用于存储数据的数组的长度通过Capacity获取,列表中的元素是我们添加进去需要管理的数据,通过Count获取列表的遍历,
遍历列表有两种方式:
1、for循环,遍历所有的索引,通过索引访问列表中的元素for(int i=0;i<Z.Count;i++){}
2、foreach遍历
foreach(int i in Z){}
列表List
List<int> Z=new List<int>(){32,25,38};
接口 interface
静态存储 static 可以直接访问
接口 interface
结构体也是可以有构造函数的。
值类型是储存在栈里面的。
实现接口,是实现抽象函数
实现接口,实现抽象函数
实现接口,实现抽象函数
实现接口,实现抽象函数
实现ni
捕捉异常
对象和对象对比的是引用(内存地址),而不是参数。
!可以用来取反
!可以用来取反
!可以用来取反
索引器:
private int[] z=new int[10];
public int sy[int i]
{
get{return z[i];}set{z[i]=value;}
}
索引器的声明类似于属性,但使用this关键字和一个或多个参数来表示索引。例如,如果你的类表示一个合计,可以使用整数索引来访问集合中的元素。
在索引器的get访问器中实现获取索引处元素的逻辑,通过return返回相应的值。在set访问器中实现设置索引处元素的逻辑。
索引器可以有多个参数,以支持多维索引或其它复杂的索引方案。
C#还允许你在索引器中使用不同的数据类型作为索引,例如字符串或自定义类型。
接口/interface:
pablic interface 类名{ 不完整的函数 }
定义一个接口在语法上跟定义一个抽象类完全相同,但不允许提供接口中任何成员的实现方式,一般情况下,接口只能包含方法,属性,索引器和事件的声明。
接口不能又构造函数,不能有字段,接口 也不允许运算符重载。
接口定义中不允许声明成员的修饰符,接口成员都是public(公有的)的。
接口的继承:public interface 接口2:接口1
此时在类中继承接口2时,是调用了继承了接口1的接口2。
多态:在父类声明一个对象的时候,可以利用它任意一个子类进行构造或重新构造,这时候这个父类对象可以是多种形态的 简称(多态)
接口/interface:
pablic interface 类名{ 不完整的函数 }
定义一个接口在语法上跟定义一个抽象类完全相同,但不允许提供接口中任何成员的实现方式,一般情况下,接口只能包含方法,属性,索引器和事件的声明。
接口不能又构造函数,不能有字段,接口 也不允许运算符重载。
接口定义中不允许声明成员的修饰符,接口成员都是public(公有的)的。
多态:在父类声明一个对象的时候,可以利用它任意一个子类进行构造或重新构造,这时候这个父类对象可以是多种形态的 简称(多态)
new:隐藏继承的成员。
abstract:创建抽象类和抽象函数。
sealed:修饰密封类和密封函数。(在函数中使用sealed时必须始终与override一起使用,且该函数一定需要是一个重写过的方法,表示不可被再次重写)
const(常量):使用const来声明某个常量字段或常量局部变量,必须在声明常量时赋初值。(不能和static一起使用,常量默认是static的,常量字段只有一个副本。)
static(静态的):
readonly:使用readonly关键字来声明只读字段。
只读字段可以在声明或构造函数中初始化,每个类或构造的实例都有一个独立的副本。可以与static一起使用,声明静态只读字段。
静态只读字段可以在声明或静态构造函数中初始化,静态常量字段只有一个副本。
构造函数是对数据进行初始化的
class Customer
{
public string name;
public string address;
private int age;
public string createTime;
public Customer()
{
Console.WriteLine("这是无参构造函数");
}
Customer c1=new.Customer()
Customer c2=new.Customer()
Customer c3=new.Customer()
F5运行之后就是
这是构造函数
这是构造函数
这是构造函数
public Customer (string a1,string a2,int a3,int a4)
{
name=a1;
address=a2;
age=a3;
createTime=a4;
}
1、如何在子类中调用父类的默认构造函数(无参)
在子类构造函数后面加上:base();//指定调用父类的无参构造函数。
public 子类名():base()
{
}
base()//指定调用无参的构造函数。此时会先调用父类的无参构造函数,然后在调用子类构造函数。
//不加base()的情况下也是默认调用无参的构造函数,如果父类中没有无参的构造函数的情况下会报错。
2、调用有参数的构造函数
设父类构造函数参数为(int i,string z)
public 子类名(int I,string Z):base(I,Z)
{
}
因已在子类构造函数内指定了父类构造函数的参数类型为int和string,又将子类构造函数内的参数放在base()内,那么此时父类内指定对应的构造函数会被base()括号内的参数赋值。
抽象类://abstract
抽象类只有函数定义没有函数体,抽象类是一个不完整的类。
abstract class 类名
{
pritave int Z; //这是一个正常的字段成员
public void 类名()
{
Console.WriteLine("这是一个正常函数");
}
public abstract void 类名();
}
抽象类内可以包含正常的字段成员及函数成员,但抽象函数必须在抽象类里,抽象类为父类,用于子类必须有用此类包含的抽象方法,供子类编辑。
语法规定,只能声明抽象类,但不能使用抽象类直接构造对象。因为不能使用一个不完整的类构造对象。但我们可以使用它的子类构造对象。
实现抽象类:
光标移动到报错上等待错误提示可以快捷操作"实现抽象类"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
密封类和密封方法: //sealed
密封类:
sealed class 类名
{
此时类为密封类,不可被其它类继承。
}
密封方法:
class 派生类
{
public sealed override 函数名
{
此时函数不可以被重写,但仍可被继承
}
}
作用:防止重写某些类导致代码混乱。
作用:商业原因。
隐藏重写方法
基类的函数正常写。
public new void AI()
{
重写方法
}
//添加关键字new可以把原本的函数给隐藏。从而达到重写方法的目的
调用:
基类 Z=new 派生类 //如:派生类中有使用隐藏方法重写的函数
此时调用的是基类方法,并非派生类中新创建的隐藏方法。
原因:此时构造派生类实际上实际上是创建了一个新的同名方法,而并非覆盖基类原有的同名方法。
且编译器只知道"Z"是一个基类类型。因此它只能调用基类中存在的方法。
即使派生类中定义了同一个方法,该方法也不会被调用。(因为基类引用无法访问派生类新增成员。)
虚方法是覆盖,隐藏方法是隐藏
base. //专门(只能) 访问父类里的数据。
protected //保护的,可以让子类访问