前言
本文为C#基础知识,是在有一定C语言或C++基础上进行的总结,因此会省略许多C语言的基础知识,但是对一些C#特有或者是C语言中比较少见或重要的知识也会归纳到博文里。
承接上文C#入门知识https://blog.csdn.net/danielxinhj/article/details/130401403
目录
一、复杂数据类型
1.枚举
a.定义
b.声明
c.枚举的类型转换(不常用)
2.数组
a.交错数组(几乎不用 有兴趣可了解)
二、值与引用
1.特殊引用类型string
三、函数
1.有参有多返回值函数
四、ref和out
1.ref是函数参数的修饰符
2.out也是函数参数修饰符
五、变长参数和参数默认值
1.变长参数关键字
2.参数默认值
六、函数重载
七、结构体
1.访问修饰符
2.结构体构造函数
一、复杂数据类型
两种类型:
- 数据集合:多个数据(变量)集合在一起构成的数据。
- 自定义:可以自己取名字,自定义的数据(变量)。
包括:枚举、数组、结构体
1.枚举
a.定义
是一个被命名的整型常量的集合 一般便是状态、类型
//枚举名 以E或者E_开头,作为我们的命名规范enum E_自定义枚举名{自定义枚举项名字1, //默认第一个值是0 下面依次累加 自定义枚举项名字2, 自定义枚举项名字3,}
如果自己给其中一个枚举项赋了值,那么后面的项都会在此基础上递增,除非人为的再次改变
b.声明
- 一般在namespace语句块当中声明
- 可以在class语句块中
- 可以在struct语句块中
- 不能在函数中声明!!!
公式:自定义的枚举类型 变量名 = 默认值; (自定义的枚举类型.枚举项)
enum E_PlayerType{Main, //默认第一个值是0 下面依次累加Other,}E_PlayerType playerType = E_PlayerType.Main;
枚举和switch语句非常适合,switch括号中写上常量,后面会自动补全。
c.枚举的类型转换(不常用)
// 枚举和int互转int i = (int)playerType;Console.WriteLine(i);// 枚举和string相互转换string str = playerType.ToString();Console.WriteLine(str);// string转为枚举// Parse后 第一个参数:你要转为的是哪个 枚举类型 第二个参数:用于转换的对应枚举项的字符串playerType = (E_PlayerType)Enum.Parse(typeof(E_PlayerType),"other");
2.数组
与C语言中数组原理相同
a.交错数组(几乎不用 有兴趣可了解)
二、值与引用
引用类型有:string、数组、类
值类型:除引用类型之外如char、int、short、bool和结构体等一系列
1.特殊引用类型string
每次赋值、拼接都会在堆中重新分配空间
三、函数
基本与C语言相通
1.有参有多返回值函数
static int[] Calc(int a,int b){int sum = a + b;int avg = sum / 2;int[] arr = {sum, avg};return arr;//return new int[] {sum, avg}; //也可直接在return中新建数组返回}
四、ref和out
1.ref是函数参数的修饰符
static void ChangeValue(ref int value){value = 3;}//调用函数时int a = 2;ChangeValue(ref a);
2.out也是函数参数修饰符
和ref使用上一模一样
// 如果不加out或ref 函数内的赋值便无法影响到外部static void ChangeValue(out int[] arr){arr = new int[] {1,2,3};}int[] arr1 = {10,20,30};ChangeValue(out arr1);
但ref和out也有区别,在于:
- ref传入的变量必须初始化out不用
- out传入的变量必须在内部赋值ref不用
int a;ChangeValueRef(ref a);//会报错!必须初始化ChangeValueOut(out a);//不会报错
五、变长参数和参数默认值
1.变长参数关键字
params int[] 意味着可以传入n个int参数 n可以等于0 传入的参数会存在arr数组当中
注意:
- params关键字后面必为数组
- 数组的类型可以是任意一个类型
- 函数参数可以有别的参数和params修饰的参数
- 函数参数中最多只能出现一个params 并且一定要是放在最后的参数
//求n个整数和的函数static int Sum(params int[] arr){//利用for循环求数组内的数字和即可}//调用时Sum(1,2,3,4,5,6);//可以传任意多个参数
2.参数默认值
有参数默认值的参数一般称为可选参数
当调用函数时可以不传入参数,不传就会使用默认值
如果要混用 那么可选参数必须写在普通参数后面
static void Speak(string str = "还没有话语"){console.WriteLine(str);}//调用时可以不传入参数Speak();
六、函数重载
要求:
- 同一语句块(class或struct)
- 函数名相同
- 参数数量不同
- 参数数量相同但类型或顺序不同
static int CalSum(int a,int b){}//这两个函数也不不能同时出现,即使其中一个用的是可选参数static int CalSum(int a , int b = 1){}
七、结构体
结构体一般写在namespace语句块中
关键字是struct
struct 自定义结构体名{//变量//构造函数(可选)//函数}
写一个学生结构体的实例
struct Student{string name;int age;bool sex;int id;// 注意结构体中的方法 目前不需要加staticvoid Speak(){ //可以使用前面声明的变量}}
1.访问修饰符
修饰结构体中的变量和方法 能否被外部使用
public是公共的 private是私有的(默认都是私有的)
2.结构体构造函数
- 没有返回值
- 函数名与结构体名相同
- 必须有参数
- 声明了构造函数就必须在其中对所有变量数据初始化
//student结构体内要写的构造函数public student(int age, bool sex, int number, string name){this.age=age;this.sex=sex;this.number=number;this.name=name;}