虾饺的.Net学习笔记-C#基础

C#基础

@author  虾饺
@date  2020/05/13 

01 基础语法

  1. 注释符:

    //单行注释
    /*
       多行
       注释
     */
    /// 文档注释: 多用来解释类或者方法
    
  2. 变量: 计算机当中存储数据的量.

    • 变量先声明再赋值再使用.
    • 声明: 变量类型 变量名;
    • 赋值: 变量名 = 值;
    • 声明并赋值: 变量类型 变量名 = 值;
    • =不表示等于,而表示赋值.
  3. 数据类型:

    1. int: 整数类型;
    2. double: 浮点数类型;
    3. decimal: 金钱类型,赋值时后面需要加上m;
    4. string: 字符串类型,可为null;
    5. char: 字符类型,存储单个字符,不可存储null;
    6. bool: 布尔类型,只有falsetrue两个值.
  4. 命名规则:

    • 首先要保证变量名有意义;
    • 以字母,_或@开头,后接字母,数字,下划线;
    • 变量名不要与关键字重复;
    • C#大小写敏感;
    • 同一变量名不允许重复定义;
    • 命名规范:
      • Camel: 除首单词,其余每个单词首字母大写,多用于命名变量;
      • Pascal: 每个单词首字母大写,多用于命名类或者方法.
  5. 赋值运算符:

    • =: 表赋值,表示把右边的值,赋给左边的变量;
    • =连接的表达式为赋值表达式,等号左边的变量的值也是赋值表达式的值。
  6. +的作用:

    • 连接: 当+两边有字符串时,起连接作用,返回新字符串;
    • 相加: 当+两边是数字时,返回两边数字的和.
  7. 占位符: {#}

    • 多了没效果,少了抛异常.;
    • 输出顺序: 顺序输出.
  8. 交换变量a,b:

    // 通用方法
    temp = a;
    a = b;
    b = temp;
    
    // 适用于数字变量,不使用第三个变量的方法
    a = a - b;
    b = a + b;
    a = b - a;
    
  9. 接受输入: Console.ReadLine();

  10. 转义符:

    • \: +特殊字符,具有特殊意义:
      • \n: 换行;
      • \": 一个英文半角双引号;
      • \t: 一个tab键的空格;
      • \b: 退格键,放到字符串两端无效;
      • \r\n: Windows操作系统下的换行;
      • \\: \.
    • @:
      1. 取消\的转义作用;
      2. 将字符串保留原格式输出.
  11. 算数运算符: +,-,*,/,%.

  12. 类型转换:

    • 隐式类型转换: 等号两侧参与运算的操作数类型必须一致,如果不一致,当目标类型大于源类型时,会发生隐式类型转换.
    • 强制类型转换: (目标类型) 值.

02 运算符

  1. Convert: 用于不兼容数据类型的类型转换.

    String sum = "2020";
    double dou = Convert.ToDouble(sum);
    Char ch = Convert.ToChar(99); //输出为c
    
  2. 自加与自减:

    int a = 0;
    Console.WriteLine(a++); //输出0
    //此时a=1
    Console.WriteLine(++a); //输出2
    //此时a=2
    Console.WriteLine(--a); //输出1
    //此时a=1
    Console.WriteLine(a--); //输出1
    //此时a=0	
    
  3. 关系运算符: <,>=,<=,==,!=.

  • 关系表达式的结果是布尔值.
  1. 逻辑运算符: &&:逻辑与,||: 逻辑或,!: 逻辑非.

    • 逻辑运算符两边一般是关系表达式或者bool类型变量;
    • 逻辑表达式的结果是布尔值.
  2. 复合赋值运算符: *=,/=,+=,-=,<<=,>>=,&=,^=,|=

  3. 运算符优先级表(从高到低)

类型 运算符 备注
基本 class.method,function(i),str[i],new,typeof,checked,unchecked
一元 +,-,!,~,i++,--i,(T)x 这里的+,-为正负号.(T)x为类型转换
乘除 *,/,%
加减 +,-
位移 <<,>>
关系 <,>,<=,>=,is,as
相等 ==,!=
逻辑与 &
逻辑异或 ^
逻辑或 ` `
条件与 &&
条件或 `
条件 ?:
赋值 =,*=,/=,+=,-=,<<=,>>=,&=,^=,` =`
  1. if语句:
    //简单if语句
    if(判断条件) {
    	条件为true时运行的代码;
    }
    //if-else语句
    if(判断条件){
    	条件为true时运行的代码;
    }else{
    	条件为false时运行的代码;
    }
    //if-else if语句
    if(判断条件1){
    	条件1为true时运行的代码;
    }else if(判断条件2){
    	条件2为true时运行的代码;
    }
    

03 流程控制

  1. 异常捕获:

    try{
    	可能会出现异常的代码;
    	如果出现异常并不会执行的代码;
    }//try和catch之间不能有其他的代码
    catch{
    	出现异常时执行的代码;
    }
    
  2. 变量的作用域: 变量声明语句所属的大括号.

  3. switch-case

    switch(变量或者表达式的值#){
    	case 值1: 当#为值1时执行的代码;
        break;// 跳出switch
        case 值2: 当#为值2时执行的代码;
        break;// 如果没有break,会继续执行当#为值3时执行的代码.
        case 值3: 当#为值3时执行的代码;
        break;
        ...
        default:当#不为上述任何值时执行的代码;
        break;
        //如果没有default,当没有匹配值时,不会执行任何代码.
    }
    
  4. 循环结构

    //while循环
    while(循环条件){
    	当条件为true时,循环执行的代码;
    }
    
    //do-while循环
    do{//不论怎么样,do-while循环都会先执行一次循环执行的代码,再进行条件判断.
    	当条件为true时,循环执行的代码;
    }while(循环条件);
    
    //for循环
    for(表达式1;表达式2;表达式3) { 
        当循环成立时,循环执行的代码;
    } //表达式1一般为声明循环变量(如int i=0;);表达式2一般为循环条件(如i<10);表达式3一般为改变循环条件的代码(如i++).
    
  5. break;continue;: 跳出与重新开始当前循环/switch.

    while(true){ //如果没有break;这会是一个死循环,永远不会执行到part3.
    	循环执行的代码part1;
    	if (条件1){
    		break; //当条件1满足时,会跳出当前while循环,直接开始执行part3的代码.
    	}
    	if (条件2){
    		continue; //当条件2满足时,会直接开始下一次while循环,不会执行part2的代码.
    	}
    	循环执行的代码part2;
    }
    代码part3;
    
  6. 类型转换补充:

    • Convert.ToInt32(String str);: 实际上调用了int.Parse()方法,成功会返回int类型变量,失败会抛出异常;
    • int.TryParse(String str, int num): 成功会返回true,并将转换后的值赋给变量num,失败了会返回false,并不会抛出异常.
  7. 三元表达式: 条件?条件为true时,表达式的值:条件为false时,表达式的值;


04 复杂数据类型

  1. 常量: const 变量类型 变量名 = 值;

  2. 枚举: enum 枚举名{值1,值2,值3,...,}

  • 枚举声明在命名空间内类外,表示命名空间下所有类都可以使用此枚举.
  1. 所有类型都可以调用ToString()来转换成String

  2. 结构: [public] struct 结构名{字段1,字段2,字段3,...,}

  3. 数组: 数组类型[] 数组名 = new 数组类型[数组长度];

  4. 冒泡排序::将数组中的元素按照从大到小/从小到大的顺序进行排列.
    0. Role0: int[] nums={9,8,7,6,5,4,3,2,1,0};

    1. Role1: 8-7-6-5-4-3-2-1-0-9;
    2. Role2: 7-6-5-4-3-2-1-0-8-9;
    3. Role3: 6-5-4-3-2-1-0-7-8-9;
    4. Role4: 5-4-3-2-1-0-6-7-8-9;
    5. Role5: 4-3-2-1-0-5-6-7-8-9;
    6. Role6: 3-2-1-0-4-5-6-7-8-9;
    7. Role7: 2-1-0-3-4-5-6-7-8-9;
    8. Role8: 1-0-2-3-4-5-6-7-8-9;
    9. Role9: 0-1-2-3-4-5-6-7-8-9;
    for(int i=0;i<number.Length-1;i++)
    {
    	for(int j=0;j<nums.Length-1-i;j++)
    	{
    		if(nums[j]>nums[j+1])
    		{
    			int temp=nums[j];
    			nums[j]=nums[j+1];
    			nums[j+1]=temp;
    		}
    	}
    }
    
  5. 方法: 将代码进行重用的机制.

    • 创建语法: [public] static 返回值类型 方法名([参数列表]){方法体;}
    • 调用语法: 类名.方法名([参数]);
  6. return:

    • 在方法中返回要返回的值;
    • 立即结束本次方法.

05 方法

  1. 实参和形参都在内存中开辟了空间.

  2. out,ref,params:

    • out: 适用于方法有多个类型不同的返回值,需要在方法外声明.
    • ref: 适用于直接在方法内对方法外定义的变量的处理,需要在方法外声明.
    • params: 可变参数.将实参列表中与可变参数数组类型一致的元素都当做数组的元素去处理.params可变参数必须是形参列表中的最后一个元素。
      static void Main(string[] args)
      {
          int[] arr = { 6, 18, 76, 15, 47 };
          int max, min, flag = 0;
          double avg;
          getData(arr, out max, out min, out avg,ref flag,1.3,2.3,5.73,8.3,9.99);
          Console.WriteLine("最大:{0};最小:{1};平均:{2};flag={3}", max, min, avg,flag);
          Console.ReadKey();
      }
      static void getData(int[] str1, out int maxnum, out int minnum, out double avgnum, ref int flagnum, params double[] str2)
      {
          Array.Sort(str1);
          minnum = str1[0];
          maxnum = str1[str1.Length - 1];
          int sum = 0;
          foreach (int i in str1)
          {
              sum += i;
              flagnum++;
          }
          avgnum = sum / str1.Length;
          Array.Reverse(str2);
          foreach (var i in str2)
          {
              Console.WriteLine(i);
          }
      }
      
  3. 方法的重载: 方法名称相同,根据参数类型和数量的不同调用不同的方法代码.

  4. 方法的递归.

posted @ 2020-05-13 18:46  冰糖虾饺  阅读(90)  评论(0)    收藏  举报