泛型List类
泛型list的底层是动态数组,其容量可自动或手动调整。
12345678910class Program { static void Main(string[] args) { List<int> IntList = new List<int>(); IntList.Add(1); IntList.Add(2); IntList.Add(3); Console.WriteLine(IntList.Count);//集合元素的数量 Console.WriteLine(IntList.Capacity);//底层数组长度 }}
可以向()中传入一个整数来限制list的底层数组大小。
List常用APIlist.Add(int value) 添加元素
list.AddRange(IEnumerable <int> list) 添加一组元素
list.Insert(int index,int valu ...
ArrayList类
ArrayListArrayList类在System.Collections名称空间中,ArrayList存放的是object类型成员。ArrayList的大小是按照其中存储的数据来动态扩充与收缩的。ArrayList不是类型安全的,使用时可能会出现类型不匹配的错误。就算都插入了同一类型的数据,在使用时也需要将它转成对应的袁类型来处理。ArrayList的存储存在装箱、拆箱导致性能低下。
123456789101112using System.Collections;class Program { static void Main(string[] args) { ArrayList arrayList = new ArrayList(); arrayList.Add("abc"); arrayList.Add(123); arrayList[2] = 12.4; arrayList.Remove(12.4); arrayList.RemoveAt(1); ...
数组
C#不支持动态数组,如果想实现类似JS数组的效果,可以参考ArralList或者List。
数组矩形数组:某个维度的所有子数组具有相同长度的多维数组。不管有多少维度,总是使用一组方括号。
1mayArray[4,6,1];//一组方括号
交错数组:每一个子数组都是独立数组的多维数组。可以有不同长度的子数组。为数组的每一个维度使用一对方括号。
1jagArray[2][7][4];
声明一维数组与矩形数组一维数组:
1int[] arr;
矩形数组:可以使用多个秩说明符。不能在数组类型区域中放数组维度长度。秩是数组类型的一部分,而维度长度不是类型的一部分。数组声明后维度数就是固定的了,然而数组长度直到数组实例化时才会确定。
123int[,,] arr1;int[,] arr2;int[3,2,6] arr3;//编译错误
实例化一维数组与矩形数组一维数组:
1234int[] arr1 = new int[4];int[] arr2 = new int[]{1,2,3,4};int[] arr3 = {1,2,3,4};var intA ...
枚举
枚举的简单使用枚举是值类型,枚举只有一种类型成员——命名的整数值常量。默认情况下第一个成员为0,每一个后继成员赋的值都比前一个成员多1。枚举成员是静态的,他们和枚举有着相同的可访问性。
12345enum TrafficLight{ Green,Yellow,Red}TrafficLight t = TrafficLight.Green;Console.WriteLine($" {t} , { (int)t } ");//Green,0
注意枚举成员的ToString()方法返回的是成员名,强制转换才能看到枚举值。
枚举底层类型与显示值可以设置底层类型:
1enum TrraggicLight : ulong {...}
可以显式指定成员的值:
123enum TrafficLight{ Green,Yellow=12,Red}
位标志程序员经常使用单个字的不同位作为一组开/关标志的紧凑方法,枚举为这样的使用提供了便利。使用Flags特性装饰枚举实际上 ...
结构体
结构体的声明和使用结构体是值类型,无法派生其他结构。结构体变量不能为null,两个结构体变量不能引用同一对象
12345struct Simple{ public int a; public int b;}Simple simple = new Simple();
把一个结构体赋值给另一个结构体,就是将一个结构体的值复制给你另一个结构体。结构体可以有实例构造函数和静态构造函数,但不允许有析构函数。结构体隐式含有一个无参构造函数,不可删除或重定义,结构体的值成员设置为默认值,引用成员设置为null。对于类,编译器只在没有声明其他构造函数时提供隐式的无参构造函数。可以不使用new来创建结构体实例,但这样做只有显式设置数据成员后才能使用它们的值并且在对所有数据成员赋值后,才能调用结构的函数成员:
1234Simple s1,s2;s1.a=3;s1.b=4;Console.WriteLine(s1.a);
注意:声明结构体时不允许使用实例属性和字段初始化语句,但是静态属性和字段可以在声明时初始化即使结构体本身不是静态的。
1234struct Simple{ ...
表达式、运算符、语句、转换
基本的表达式、运算符、语句、转换在这就不过多介绍,有几个比较少见的就在这多提一嘴吧。
字符串字面量@逐字字符串字面量以@字符为前缀,而且该字符串中的转义序列不会被求值。逐字字符串字面量的唯一例外是相邻的双引号组会被解释成单个双引号字符
12string vst1 = @"Hello world""";string vst2 = @"H\tell\no\tworld""";
委托的比较如果两个委托都是null,或两者的调用列表中有相同数目的成员,并且调用列表相匹配,那么比较返回true。
运算符重载运算符重载不能创建新的运算符,不能改变运算符的语法,不能重新定义运算符如何处理预定义类型,不能改变运算符的优先级或结合性。注意:对于引用类型的对象,前置操作没有问题,因为没有进行复制。但是对于后置操作,因为保存的副本是引用的副本,所以这意味着原始引用和引用副本指向相同的对象。
声明时必须使用public static。
1234567891011121314151617181920class Program ...
多态
原本打算抽象类和接口一起讲的,但是抽象类也属于多态的章节,而多态又是C#中很重要的部分,所以我觉得还是抽象类和多态一起讲吧。
虚方法与覆写方法(virtual)虚方法可以使基类的引用访问升至派生类内。基类的方法用virtual标注。派生类的方法用override标注。
12345678910111213141516class Program { static void Main(string[] args) { Human human = new Man(); human.Eat();//我可以吃方便面 }}class Human { virtual public void Eat() { Console.WriteLine("我可以吃饭"); }}class Man : Human { override public void Eat() { Console.WriteLine(&q ...
类的继承
屏蔽基类的成员派生类不能删除它继承的成员但是可以用与基类成员名称相同的成员来屏蔽基类成员。要让编译器知道你是故意屏蔽,可使用new操作符。也可以屏蔽静态成员。
123456789101112class Father { public string name = "爸爸"; public void MakeMoney() { Console.WriteLine("我可以赚钱"); }}class Son : Father { new public string name = "儿子"; new public void MakeMoney() { Console.WriteLine("我也可以赚钱"); }}
基类访问如果需要访问被隐藏的继承成员,可使用基类访问表达式:base.
1Console.WriteLine(base.name);
基类引用可以声明基类变量 ...
函数的参数
引用参数(ref)当参数类型为引用参数时,实参必须是变量,在用作实参前必须被赋值!如果是引用类型变量,可以赋值为一个引用或null。函数声明和调用时都需要在ref参数前加上”ref”
1234void RefTest(ref int a){ ... }int a = 3;RefTest(ref a);RefTest(3);//报错,必须为变量
对于值参数,系统会在栈上为形参分配内存,而引用参数不会在栈上分配内存,形参的参数名将作为实参变量的别名指向相同的内存位置。将引用类型对象作为值参数传递时:如果在方法内创建一个新对象并赋值给形参,在方法调用结束后,将切断形参和实参的关联,新对象也不复存在。
123456789101112131415161718192021using System;class Program { static void Main(string[] args) { //调用前 Student std = new Student(); std.age = 20; Co ...
函数重载
函数重载当我们调用Console.WriteLine()函数时,我们有时候向这个函数传入整型数字,有时传入浮点数字,有时传入字符串。为什么Console.WirteLine()函数可以接受不同的参数呢?因为在C#语言中有着名为函数重载的功能。
函数的签名函数的签名包括:函数名,函数参数的种类、个数和顺序,还有它所在的类和名称空间。
12345public class Student{ public void study(string name,int school){ Console.WriteLine($"我叫{name},我在{school}读计算机专业。") }}
注意!!!!!!方法的返回值不属于函数签名的一部分!!!!!!
实现函数重载当函数的签名不同时,就可以实现函数的重载,我们可以声明多个同名函数保证他们的参数列表不同,在调用时传入想要执行的那个函数的参数,就可以做到实现不同的功能。
12345678public class Student { publi ...