写在最前

  • 一直以来都想自己做一款游戏,但是对于非计算机出身的我而言,编程就是一座不能不跨越的大山。大学期间有过Python的粗浅学习了解,但课程上完之后便很快遗忘了。因此这次学习C#,强制自己写学习笔记,不仅是方便自己以后遗忘时可以随时翻阅复习,更是为自己定下一个明确的目标,以目标驱动自己。
  • 这篇笔记对应的是唐老狮的C#四部曲──C#入门课程地址

一、第一个应用程序

注释

  1. 两杠注释
    // 注释 //
  2. 星号注释
    /* 注释多行 */
  3. 三杠注释
    /// 注释命名空间、类、函数 ///

代码位置

1
2
3
4
5
6
7
8
9
10
11
//命名空间,面向对象相关(工具包)
namespace project
{
//类,面向对象相关(工具)
class
{
//函数,工具能做的事
//主函数,程序入口
static void Main(sting[] args)
}
}

控制台打印

1
2
3
4
5
6
7
8
9
10
//控制台打印,光标换行
console.writeline("hello");
//控制台打印,光标不换行
console.write("hello");
//检测输入,回车后才算输入结束
console.readline();
//检测是否有输入,按下一个键后就算输入结束
console.readkey();被
//获取输入的值
console.readkey().KeyChar

二、变量

折叠代码

1
2
3
#region
//code
#endregion

如何声明变量

  1. 变量声明语法
1
2
3
4
5
6
//不能无中生有,必须先声明,最好声明时就初始化。
//变量类型 变量名 = 初始值;
int i = 1;
//多个同类型变量同时声明:变量类型 变量名1 = 值1,变量名2 = 值2,变量名3 = 值3;
int i1 = 1, i2 = 2, i3 = 3;
//声明的变量只能在当前语句块或层级更低的语句块中使用。
  1. 变量类型

    变量类型 范围 字节
    sbyte -128 ~ 127 1
    int -21亿 ~ 21亿 4
    short -32768 ~ 32767 2
    long -9百万兆 ~ 9百万兆 8
    byte 0 ~ 255 1
    uint 0 ~ 42亿多 4
    ushort 0 ~ 65535 2
    ulong 0 ~ 18百万兆 8
    float 存储7/8位有效数字,四舍五入。后面需加f 4
    double 存储15/17位有效数字,四舍五入 8
    decimal 存储27/28位有效数字,四舍五入。后面需加m 16
    bool true/false 1
    char 单个字符,单引号 2
    string 多个字符,无上限,双引号

变量本质

  1. 装值的一个容器,本质是占用的内存空间不同。
  2. 1字节 = 8 位。位本质上是电信号中的开关,用0/1表示。
  3. sizeof 方法,可以获取变量类型所占的内存空间。e.g. sizeof(int)
  4. 2进制转10进制的规则:从右往左看最右边的一位为第0位,如果该位不为0则加上2的n位次方。
  5. 有符号的变量类型,最左边的一位用来表示符号:0为正数,1为负数。

变量的命名规范

必须遵守的的规则

  1. 不能重名
  2. 不能以数字开头
  3. 不能程序关键字命名
  4. 不能有特殊符号(下划线除外)

推荐的命名规则

  1. 驼峰命名法──首字母小写,之后单词首字母大写
  2. 帕斯卡命名法──所有单词首字母大写
  3. 常量──通常使用全大写字母,并使用下划线来分隔单词

三、常量

  1. 常量的声明
    const 变量类型 变量名 = 初始值;

  2. 常量的特点

    1. 必须初始化
    2. 不能被修改
    3. 常用于一些常用不变的量

四、转义字符

定义

字符串的一部分,用来表示特殊含义的字符

用法

\字符

一些转义字符

用法 含义
\’ 单引号
\" 双引号
\n 换行
\\ 单个斜杠
\t 制表符
\b 光标退格
\0 空字符
\a 警告音

取消转义字符

在字符串前面加上@符号,可以让字符串中的转义字符失效。

五、类型转换

隐式转换

不同类型直接自动进行转换;大范围装小范围

  1. 相同类型
    有符号:long > int > short > sbyte
    无符号:ulong > uint > ushort > byte
    浮点数:double > float (decimal 没办法使用隐式转换装double、float)

  2. 不同类型

    1. 有符号变量可以装无符号变量,前提是范围一定要是涵盖的。
    2. 浮点数(包括 decimal )是可以装所有的类型的整数的,太大的数会使用科学计数法。
    3. char可以隐式转换成int、ushort、long、ulong等。因为char其实是一个无符号的16位的数,范围是0~65535。Unicode

总结

  1. 高精度(大范围)装低精度(小范围)
  2. double → float → 整数(无符号、有符号)→ char
  3. decimal → 整数(无符号、有符号)→ char
  4. string 和 bool 不参与隐式转换规则的

显式转换

手动处理,强制转换

  1. 括号强转

    1. 变量类型 变量名 = (变量类型)变量;
    2. 将高精度的类型强制转换为低精度。
    3. 括号强转可能会出现范围问题造成的异常。
    4. 浮点数强转成整形时,直接抛弃掉小数点后的小数。
    5. bool 和 string 是不能通过括号强转的。
  2. Parse法

    1. 变量类型.Parse(“字符串”);
    2. 字符串必须能够转换成对应类型,并且需要考虑范围能否被包围,否则报错。
    3. 作用相当于消去字符串两边的双引号。
  3. Convert法

    1. Convert.To目标类型(变量或常量);
    2. 能更加准确地将各个类型之间进行相互转换。
    3. 如果将字符串转成其它类型,必须合法合格。
    4. Convert法将浮点数转成整形时,会四舍五入。
    5. 可以把布尔类型转换为数值类型
    类型 用法
    转 sbyte Convert.ToSByte()
    转 short Convert.ToInt16()
    转 int Convert.ToInt32()
    转 long Convert.ToInt64()
    转 byte Convert.ToByte()
    转 ushort Convert.ToUInt16()
    转 uint Convert.ToUInt32()
    转 ulong Convert.ToUInt64()
    转 float Convert.ToSingle()
    转 double Convert.ToDouble()
    转 decimal Convert.ToDecimal()
    转 bool Convert.ToBoolean()
    转 char Convert.ToChar()
    转 string Convert.ToString()
  4. 其它类型转 string

    1. 变量.tostring();
    2. 当打印的时候,就已经自动调用了其他类型变成了 string 。

六、异常捕获

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//必有
try
{
//希望可以进行异常捕获的代码块
}
catch
{
//如果出错,会执行catch中的代码
//catch(Exception e)具体报错跟踪,通过e得到具体的错误信息
}
//可有
finally
{
//最后的代码,不管有没有出错,都会执行其中的代码
}

七、运算符

算数运算符

  1. 赋值符号
    先看右侧,再看左侧,把右侧的值赋给左侧。=
  2. 算数运算符
    1. +加
    2. -减
    3. *乘
    4. /除:默认的整数是int,如果直接用于除法,会丢失小数点后的小数。可以加上浮点数的特征。e.g. 1f
    5. %取余
  3. 算数运算符的优先级
    1. 乘除取余的优先级高于加减
    2. 括号改变优先级,优先计算括号内内容。多层括号,从内往外算。
  4. 复合运算符
    1. +=
    2. -=
    3. *=
    4. /=
    5. %=
  5. 自增减
    1. i++,i-- 先用再算
    2. ++i,–i 先算再用

字符串拼接

  1. 字符串拼接方式1
    1. 可以通过+号进行字符串的拼接。
    2. 和其他类型混合运算时,也遵循从左往右,括号优先的顺序。
  2. 字符串拼接方式2
    1. string.Format(“待拼接的内容”,内容1,内容2,……);
    2. 使用占位符代替需要拼接的内容:{数字},0~n,以此往后。
  3. 控制台打印拼接
    1. console.WriteLine(“待拼接的内容”,内容1,内容2,……);
    2. console.Write(“待拼接的内容”,内容1,内容2,……);

条件运算符

  1. 条件运算符
    1. 是否大于 >
    2. 是否小于 <
    3. 是否等于 ==
    4. 是否不等于 !=
    5. 是否大于等于 >=
    6. 是否小于等于 <=
  2. 注意事项
    1.优先级低于算数运算符
    2.不能进行范围比较:1 < a <5
    3.数值直接可以使用任意条件运算符比较,而string、bool类型只能同类型间使用 == 和 != 比较。
    4.char比较特殊,本质上是转化为数字后进行比较的。Unicode

逻辑运算符

逻辑运算符优先级条件运算符;逻辑非的优先级在其中较高,逻辑与其次,逻辑或最低。

  1. 逻辑与 &&
    有假则假,同真为真
  2. 逻辑或 ||
    有真为真,同假为假
  3. 逻辑非 !
    取反,真变假,假变真
  4. 逻辑运算符的短路原则
    只要&&或者||左边满足了条件,就不会跑剩下的内容了。

位运算符

将值转化为二进制进行计算。

  1. 位与 &
    右对齐,有0则0
  2. 位或 |
    右对齐,有1则1
  3. 异或 ^
    右对齐,相同为0,不同为1
  4. 位取反 ~
    补全这个类型的位数,0变1,1变0
  5. 左移 < 与右移 >
    左移:右侧加几个0
    右移:右侧去掉几个数

三目运算符

  1. bool类型 ? bool类型为真返回内容 : bool类型为假返回内容;
  2. 返回值必须一致,并且必须使用!

八、条件分支语句

  1. if语句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//不需要使用分号结尾
//可以嵌套使用
//语法
if( bool类型值)
{
//满足条件执行
//code
}
//可有,满足对应的条件时执行
else if( bool类型值)
{
//code
}
//可有,上面的条件都不满足时执行
else
{
//code
}
  1. switch语句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//语法
//其中的变量和常量之间需要是可隐式转换的
switch(变量)
{
case 常量1:
//满足提交执行
//code1
break;
case 常量2:
//满足提交执行
//code1
break;
default:
//可省略
//如果上面的条件都没过,会执行
break;
}

//当某些条件的结果是一样的就可以使用贯穿
switch(变量)
{
case 常量1:
case 常量2:
//code1
break;
default:
break;
}

九、循环语句

  1. while 语句
1
2
3
4
5
6
7
while(bool类型的值)
{
//当条件满足时,执行其中的代码
//执行完毕后,会再次回到while循环开头再次进行判断
break;//跳出循环
continue;//跳到下一个循环
}
  1. do while 语句
1
2
3
4
5
6
7
//先执行一次再判断
//注意最后有一个分号
//很多情况下可以取代while(true)+break;
do
{
//循环语句块内容
}while(bool类型的值);
  1. for 语句
1
2
3
4
5
6
7
8
for(初始表达式;条件表达式;增量表达式)
{
//循环语句块
}
//初始表达式:一般是临时变量,用于计数,可声明多个,第一次进入循环执行。
//条件表达式:表面进入循环的条件,进入循环前都会判断。
//增量表达式:初始表达式中变量进行自增减,执行完循环语句块才会执行。
//()内的表达式都不填则为死循环。