前言

本文为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. 数据集合:多个数据(变量)集合在一起构成的数据。
  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;}