C#学习笔记——基础语法(壹)
一、变量
语法:
变量类型 变量名
整型
sbyte、int、short、long
无符号整型
byte、uint、ushort、ulong
浮点数
float = 1.12f(f或F)、double = 1.135、decimal = 1.121m (m或M)
特殊类型
bool、char、string
二、常量
常量必须初始化,不能够修改
const 变量类型 变量名
补充:const 和 readonly
- const初始化时机在编译期,并且只能在声明时赋值,默认static
- readonly初始化时机在运行期,并且可以在声明时或者构造函数中赋值,默认是实例级
三、转义字符
1、转义字符
\t \b \\ \' \" \a \n
2、取消转义字符(@符号)
@"字符串"
四、类型转换
1、隐式转换
相同类型:
- 大范围装小范围
- 浮点型中,decimal不与其他两个转换(float和double)
不同类型:
-
有符号能装无符号的
-
浮点型能装整型
特殊类型:
-
bool、string无法与其他类型相互隐式转换
-
char能隐式转换为部分整型和浮点数
2、显式转换
(1)括号强转:高精度转低精度
变量类型 变量名 = (变量类型)变量
-
可能会出现精度、范围问题
-
浮点数转整型,小数点后直接舍去,不四舍五入
-
bool和string不能通过括号强转
(2)Parse法:字符串类型转为对应类型
变量类型 变量名 = 变量类型.Parse("字符串")
-
字符串必须能够转换成对应类型,否则报错
-
值的范围必须符合,否则报错
(3)Convert法:更准确的将各个类型之间进行相互转换
变量类型 变量名 = Convert.To目标类型(变量或常量)
-
填写变量或常量必须正确,否则报错
-
浮点数转整型,精度更高,会四舍五入
-
特殊类型转换中,bool可以转成数值类型,true为1,false为0
(4)拼接打印:其他类型转string
变量类型 变量名 = 变量.ToString();
- 当进行字符串拼接时,就会自动调用
ToString转成string
Console.WriteLine("123123" + 1 + true);
五、异常捕获
语法:
try
{
}
catch(Exception e)
{
}
finally //可选
{
}
六、运算符
1、算术运算符
-
赋值运算符:
= -
算数运算符
+-*/% -
复合运算符
+=-=*=/=%= -
自增减:
++--
2、字符串拼接
方式一:通过+或+=号拼接多个字符串
方式二:
string 变量名 = string.Format("待拼接的内容",内容1,内容2,......);
例:
string str2 = string.Format("我是{0},我今年{1}岁,我想要{2}","唐老狮",18,"好好学习");
// 也可以直接控制台打印拼接
Console.WriteLine("我是{0},我今年{1}岁,我想要{2}","唐老狮",18,"好好学习");
3、条件运算符
< == != >= <=
4、逻辑运算符
-
逻辑运算符:
&&||! -
优先级:
-
&&||低于条件运算符和算术运算符 -
!优先级较高,比逻辑运算符优先 -
!>&&>||
-
5、位运算符
& | ^ ~ << >>
6、三目运算符
bool类型 ? bool为真返回的内容 : bool为假返回的内容
七、条件分支语句
1、if
if{
}else if{
}else{
}
2、switch
switch(变量)
{
case 常量:
break;
case 常量:
break;
......
default:
break;
}
贯穿: 除非明确使用break中断流程,否则程序会向下执行直到遇到第一个break
switch(变量)
{
case 常量:
case 常量:
case 常量:
break;
......
}
八、循环语句
1、while
while (条件)
{
}
2、do...while
do
{
} while(条件);
3、for
for (初始;条件;增量)
{
}
循环相关关键词:
break:终止循环
continue:直接开始下一循环
补充:迭代器遍历
foreach (类型 item in 集合)
{
// 处理每个item
}
九、枚举
1、声明
enum E_自定义枚举名
{
自定义枚举项名字1, // 第一个默认值为0
自定义枚举项名字2 = 5, // 也可以赋值,后面的值默认累加
......
}
2、使用
自定义枚举类型 变量名 = 自定义枚举类型.枚举项
3、转换
// 1、int
int i = (int)myType;
myType = (PlayerType)i;
// 2、string
string str = myType.Tostring(); // 转换的是枚举项的名字
myType = (PlayerType)Enum.Parse(typeof(PlayerType),"Player"); //Parse转换后是通用类型,因此前面要强转
十、数组
1、一维数组
- 声明:
变量类型[] 数组名;
变量类型[] 数组名 = new 变量类型[数组长度];
变量类型[] 数组名 = new 变量类型[数组长度]{内容1,内容2,...} // 必须写够数
变量类型[] 数组名 = new 变量类型[]{内容1,内容2,...}
变量类型[] 数组名 = {内容1,内容2,...}
- 使用:
// 1.数组的长度
数组变量名.Length
// 2.获取数组中的元素
数组名[下标]
// 3.修改数组中的元素
数组名[下标] = 值;
// 4.遍历数组
for (int i = 0; i < array.Lenth; i++){ ... }
// 5.增加、删除数组的元素(只能new新数组)
int[] array2 = new int[6]
for (int i = 0; i < array.Lenth; i++){
array2[i] = array[i];
}
array = array2; // array的空间会被c#自动回收
2、二维数组
- 声明:
变量类型[,] 数组名;
变量类型[,] 数组名 = new 变量类型[行,列];
变量类型[,] 数组名 = new 变量类型[行,列]{{...},{...}};
变量类型[,] 数组名 = new 变量类型[,]{{...},{...}};
变量类型[,] 数组名 = {{...},{...}};
- 使用:
// 1.数组的长度
数组变量名.GetLength(0); //行
数组变量名.GetLength(1); //列
// 2.获取数组中的元素
数组名[行下标,列下标]
// 3.修改数组中的元素
数组名[行下标,列下标] = 值;
// 4.遍历数组、增加、删除等与一维数组类似
3、交错数组
与二维数组的区别:每行的列数可能不同
- 声明:
变量类型[][] 交错数组名;
变量类型[][] 交错数组名 = new 变量类型[行数][];
变量类型[][] 交错数组名 = new 变量类型[行数][] {一维数组1,一维数组2,... };
变量类型[][] 交错数组名 = new 变量类型[][] {一维数组1,一维数组2,... };
变量类型[][] 交错数组名 = {一维数组1,一维数组2,... };
- 使用:
// 1.数组的长度
数组变量名.Length; // 行数
数组变量名[行索引].Length; // 某一行的列数
// 2.获取数组中的元素:
数组名[行下标][列下标];
// 3.修改数组中的元素:
数组名[行下标][列下标] = 值;
// 4、其他操作和之前的数组类似
十一、函数
1、语法
修饰符 static 返回类型 函数名(参数类型 参数名1,...){
内容
...
return 返回值;
}
- static是可选的,这里加上了
2、使用
函数名(参数);
3、变长参数和参数默认值
返回类型 函数名(params 类型[] arr)
-
params关键字后必为数组 -
函数参数中最多只能出现一个params关键字,并且混用时必须放在最后一个参数,前面可以有其他类型参数
4、参数默认值
返回类型 函数名(参数类型 参数名1 = 默认参数,...)
- 函数参数中可以有多个参数默认值,并且混用时必须放在普通参数后
5、函数重载
-
概念:在同一语句块中,函数/方法名相同,参数数量不同,或者参数的数量相同,参数类型或顺序不同
-
作用:命名一组功能相似的函数,减少函数名的数量,避免命名空间污染,提升代码可读性
-
注意事项:
-
重载和返回值类型无关,只与参数类型,个数,顺序有关
-
调用时,程序会自己根据传入的参数判断使用哪个重载
-
参数中加了ref和out算同一种,params也算重载(默认参数值不算)
-
6、递归函数
-
概念:函数自己调用自己
-
一个正确的递归函数:
- 必须要有结束的条件
- 用于条件判断的条件必须要能够达到停止的目的
十二、结构体
1、语法
struct 自定义结构体名
{
变量
构造函数(可选)
函数
}
2、使用
// 1、创建
Student s1 = new Student();
// 2、使用
s1.age;
s1.Speak();
3、注意事项
- 结构体中声明的变量不能直接初始化
- 结构体中可以有结构体,但不能是自己的结构体
- 方法内部可以直接使用内部的变量(默认私有)
- 变量和函数前可加public或private(默认私有)
- 如果申明了构造函数,必须对所有变量数据初始化