前言
本文为C#基础知识,是在有一定C语言或C 基础上进行的总结,因此会省略许多C语言的基础知识,但是对一些C#特有或者是C语言中比较少见或重要的知识也会归纳到博文里。
一、复杂数据类型
两种类型:
- 数据集合:多个数据(变量)集合在一起构成的数据。
- 自定义:可以自己取名字,自定义的数据(变量)。
包括:枚举、数组、结构体
1.枚举
a.定义
是一个被命名的整型常量的集合 一般便是状态、类型
代码语言:javascript复制//枚举名 以E或者E_开头,作为我们的命名规范
enum E_自定义枚举名
{
自定义枚举项名字1, //默认第一个值是0 下面依次累加
自定义枚举项名字2,
自定义枚举项名字3,
}
如果自己给其中一个枚举项赋了值,那么后面的项都会在此基础上递增,除非人为的再次改变
b.声明
- 一般在namespace语句块当中声明
- 可以在class语句块中
- 可以在struct语句块中
- 不能在函数中声明!!!
公式:自定义的枚举类型 变量名 = 默认值; (自定义的枚举类型.枚举项)
代码语言:javascript复制enum E_PlayerType
{
Main, //默认第一个值是0 下面依次累加
Other,
}
E_PlayerType playerType = E_PlayerType.Main;
枚举和switch语句非常适合,switch括号中写上常量,后面会自动补全。
c.枚举的类型转换(不常用)
代码语言:javascript复制// 枚举和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.有参有多返回值函数
代码语言:javascript复制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是函数参数的修饰符
代码语言:javascript复制static void ChangeValue(ref int value)
{
value = 3;
}
//调用函数时
int a = 2;
ChangeValue(ref a);
2.out也是函数参数修饰符
和ref使用上一模一样
代码语言:javascript复制// 如果不加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.参数默认值
有参数默认值的参数一般称为可选参数
当调用函数时可以不传入参数,不传就会使用默认值
如果要混用 那么可选参数必须写在普通参数后面
代码语言:javascript复制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
代码语言:javascript复制struct 自定义结构体名
{
//变量
//构造函数(可选)
//函数
}
写一个学生结构体的实例
代码语言:javascript复制struct Student
{
string name;
int age;
bool sex;
int id;
// 注意结构体中的方法 目前不需要加static
void 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;
}