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(默认私有)
  • 如果申明了构造函数,必须对所有变量数据初始化