C#语言
- 基本语法
- C#文件以cs结尾 Main()为入口点函数
- 从上到下一条条执行
- 大小写敏感
- 函数参数用()包围
- 两句之间用;分隔
- 注释 单行注释(//) 多行注释(/* */)
- 双引号
- 变量
- 变量看做数据的容器
- 定义变量方式:类型 变量名
- 变量类型
- 不能放与类型名不兼容的数据
- 变量名不能重名
- 变量的命名
- 命名规则: 首字符必须为字母或下划线 其后字符可以为任意个数字/字母/下划线 不能全部使用C#关键字(VS中蓝色)
- 也是类/函数名命名规则
- 中文变量名(类/函数名)
- C#中建议变量首字母小写
- 变量的声明(使用前需赋值)
- 常用基本数据类型
- string int char bool decimal byte double long float
- bool: true/false
- string转义符: “\”ab\”” “a\nb” “a\\b” @“c:\temp\1.jpg” 转义只针对在代码中直接写 不包括从程序中读取的字符串(Console.ReadLine())
- 数据类型转换: Convert.ToString() Convert.ToInt32()
- 其他数据类型
- 数组
- 枚举
- 结构
- 类
- 接口
- 值类型 & 引用类型
- Visual Studio 2008编程时会用到两种形式的内存空间(堆栈 & 托管堆) 这两种数据结构支持程序的运行: 堆栈用于存放值类型 / 托管堆用于存放引用类型
- 值类型(基本数据类型 & 枚举 & 结构体)
- 引用类型(类 & 接口 & 委托 & …)
- 图(引用类型)
- 装箱 & 拆箱
- 装箱: 值类型/堆栈 → 引用类型/托管堆
- 拆箱: (反之)
- 装箱与拆箱的实现(代码1): 对值类型装箱将把该值类型装箱到Object类型中或相应的接口类型中 实现了装箱(见图)
- 为何装箱拆箱: C#未支持泛型之前 为了使某些程序具有通用性 使用Object 所以必须装箱/对于已装箱对象 因无法调用其指定方法 所以必须拆箱
- 运算符 表达式
- + - *(乘) /(除) %(取余)
- +可用作字符串连接
- ++(自增)—(自减)
- 运算符优先级: 括号是王道
- 变量可以和字面量混合运算
- 赋值
- 赋值运算符= :让左边的变量值等于右边的计算结果 i=i+1/左边必须为变量 不能是表达式 不能是常量
- 赋值表达式可单独作为一个值来处理 值等于被赋值的变量的值: Console.WriteLine(“{0}”, i=1) //结果: 1
- += -= *= /=
- i2=i1++ i2=++i1
- 两个变量值的交换 i3=i1; i1=i2; i2=i3;
- 布尔运算
- 相等判断: == 不要和=混淆
- 不等判断: !=
- 大小比较: > < >= <=
- 取反: !
- 组合运算: &&(并且) ||(或者)
- if
- 单句时花括号可省略但不建议省略
- If语句的嵌套
- switch case
- 离散值判断(被判定的值进入满足条件的分支执行/case中的值必须为常量 不能是变量 表达式)
- 不要忘了break;
- Case语句的合并处理 唯一一个case之后不用加break的情况
- while循环
- While后表达式为true 则花括号代码执行
- do while 先做…之后while为true则再来一次
- return退出整个函数
- for循环
- For(code1;code2;code3) code1: 循环初始化代码 只在循环开始前执行一次 code2: bool类型表达式 每次循环完成后判断是否为true 是则开始下一轮循环 code3: 每次循环后执行一次
- for的三段代码均可省略 但不可丢掉;
- break continue同样可应用于for
- 循环的中断
- break: 立即终止整个循环
- continue: 立即终止当前循环步骤 进入下一次循环步骤
- Return: 退出当前函数
- 类型的转换Cast Convert
- 存在交集的类型之间才能进行Cast(int i;string s=(string)I; //不可) 不寻在交集的情况需用Convert类提供的方法
- Cast只是视角不同 内存中数据无变化/Convert不再是内存级别的转换 而是考虑数据意义的转换 是一个加工 改造的过程
- Cast: 隐式转换&显式转换(开发人员负责):把源类型赋值给目标类型 两个类型不一致的时候会发生类型转换/目标类型一定能满足源类型时为隐式 不一定时为显式
- int.MaxValue/int.MinValue/byte.MaxValue/byte.MinValue
- 类型.ToString()
- this关键字
- This关键字(简单的说: 代表当前类对象): ①用于索引 ②代表当前类对象(代码) ③其他场合(如构造函数中)
public partial class Form1 : Form
{
private void Form1_Load(object sender, EventArgs e)
{
this.TextBox1.Text = “Hello”;
}
}
- base关键字
- Base关键字(简单的说: 代表直接父类): ①使用base可以访问父类中成员(代码1) ②代表父类构造函数(代码2)
public class Car : Vehicle //代码1
{
public Car()
{
base.GetName();
}
}
public class Car : Vehicle //代码2
{
public Car(string name) : base(name, 200)
{
…
}
}
- 数组
- 保存多个值(长度固定/.Length可为0/几乎任意类型都可以声明数组)
- int[] nums = {5,3}; int[] nums = new int[2]; int[] nums = new[2]{5,3};
- 数组索引器: nums[0]; nums[1]; //索引器从0开始
- Foreach循环: foreach(string name in names)/与for循环区别:1.无法修改2.for可以倒着遍历&隔一个遍历
- 枚举
- 枚举类型是”以自己的方式使用整型”(可以是byte sbyte short ushort int(默认) uint long ulong的子类)
- 确定数量&确定值的几个取值: 东西南北 男女 上中下
- enum QQStatus{online,offline,hiden};QQStatus s=QQStatus.hiden;
- public enum : long{Sun=1,Tue,Wen,Thu,Fri,Sat,Sun}
- 结构
- 结构体(struct): 常用于封装小型相关变量组(如点的坐标x y)
public struct Point
{
public int X;
public int Y;
}
- 函数
- 函数: 代码重用的一种机制/参数&返回值/无参()不可省&无返回值void
- 自己写函数/自己无法确定的数据通过参数传入
- 可变参数: int Sum(string name,params int[] names); //可变参数数组必须是最后一个/VFunc(“aaa”,”vvv”,”222”,…);
- 参数默认值: 函数重载实现
- 函数的ref & out参数
- 函数参数默认是传递值的 也就是“复制一份”
- ref必须先初始化 因为是引用 所以必须先”有” 才能引用/ out则是内部为外部赋值 所以不需要初始化 并且初始化了也没用
- out一般用于函数有多个返回值的情况: int.TryParse(str,out i); //一个返回结果是成功失败bool型 另一个转换结果i
- 函数重载
- 参数不同/与返回值无关