变量
交换变量
3.1 通过中间变量
3.2 两数相加,减某一个数
值类型变量(int,bool等)如果作为类的全局变量,会有默认值,但如果作为局部变量,则必须手动赋值
代码规范
1.注释
2.骆驼(camel)命名,第一个单词首字母小写,之后单词首字母大写
3.帕斯卡(pascal)命名,所有单词首字母大写
4.定义的变量或方法,名字要有意义
方法名:动词
变量名:一般用名词,按功能命名,按方法返回值内容命名
usrerName
= GetUserName();
数组
用于储存一堆的类型相同的数据,便于操作和管理数据
声明数组:
1.int
[] arr1;
arr1 = new int[5];
2.int [] arr2 = {1,2,3,4,5};
3.int []
arr3 = new int[] {1,2,3,4,5};
声明一个变量时,其实是在内存的栈里面开辟空间,并将变量放入空间里,默认情况下的值是NULL,
如:int[] arrInt; //此时arrInt等于null
arrInt = new int[5] // new 关键字做了3个事情
1.开辟堆空间 2.创建对象
3.调用对象的构造函数
在栈中开辟了一个小空间,在堆中开辟了5个连续的空间,等号赋值时,将堆中的第一个空间地址存入到栈空间中
数组一旦创建后,就不能再修改数组长度,因为数组创建时,按照长度,开辟了几个连续的内存空间
ArrayList
动态数组
ArrayList默认创建一个长度为4的object数组,调用Add方法时,先判断长度是否超过4个,若没有则直接添加到object数组中,反之,则新建一个长度为之前2倍的object数组,然后把之前的数组复制到这个数组里面,并把引用指向新数组,并设置object数组默认长度为新长度。优点:访问速度快,因为本质上使用的是数组,所以空间上是绝对连续的。缺点:一旦量满,则需要重新new数组对象扩容,消耗资源
LinkedList元素的内存地址是不相连的,通过指针链的方式进行访问,每个元素都保存了下一个元素的内存地址,优点是真正的动态分配内存,缺点:访问任何一个节点的时候,都需要从第一个开始遍历。
多维数组
二维数组:string[,] strArr = new string[2,3]; 二行三列的数组
三维数组:string[,,]
strArr = new
string[2,3,4];
多维数组的Length是各个维数的乘积,GetLenght(维数);用于获取指定维数的长度
交错数组:本质上是一个一维数组,是一个用来存储数组(任意长度)的一维数组
声明:string[][]
strArr = new string[2][]; //第二维不能写维数
strArr[0] = new string[5];
strArr[0].length;// 获取长度
为什么要用方法: 重复调用,封装的具体实现
函数就是一堆代码进行重用的一种机制,函数就是一段代码
方法的大括号其实就是一个作用域,只要出现了大括号,就会有一个新的作用域块,那么该作用域中创建的对象不能超出此作用域访问
静态方法只能调用静态方法和静态变量
方法参数就相当于一个方法的局部变量 实参:指实际传递的参数 形参:指方法声明的参数声明
方法调用:当我们参数是值类型时,那么调用的方法传参,会将实参的数据复制一份,赋值给形参,这样,实参和形参数据的值一样,但是是不同的两份。
为要什么要用方法重载:
只要记住一个方法名,就可以通过不同的参数来调用不同的方法,方便调用
方法重载的关键条件是,方法名一致,参数列表不同
ref out params
参数
如果方法的值类型参数,没有加ref/out关键字,则在调用时,传给方法的是变量的值,而非变量的引用
ref/out相同点:传递的都是引用
不同点:out关键在于侧重于输出参数,也就是我调用你这个方法,是为了通过输出参数的方式获得值,通常在需要返回多个值的时候使用,所以必需在方法返回之前赋值,而ref侧重于修改,也就是我调用你这个方法,并传入参数的目的是为了在方法中修改传入的这个变量,所以ref参数必须在传入之前就赋值。
params
可变参数数组,只能有一个,并且必须放在参数的最后,使用的时候还是可以传数组进去的,也可以直接传和参数数组同类型的元素进去
方法重载时,当多个方法的参数列表中,先出现参数的类型和后面可变参数的类型一样时,用户调用该方法时,会优先选择调用参数最多的方法,如果参数数目相同,则优先调用不带params的方法
ref
传递参数前要赋值,在方法中修改值,侧重于修改
out 传递前不用赋值,在方法中必须赋值,侧重于输出
params
修饰数组参数,在参数列表中只能有一个,并且必须放在最后
类型转换
隐式类型转换(数值类型之间)
显示类型转换:(type)要转换的变量
只有在内存栈上的才可以使用显示类型转换
object中的ToString默认,将对象的类的全称转换为string类型
Convert考虑数据意义的转换,是一个加工改造的过程,可以转换任何类型
is和as 只能用来检查引用类型
typeA is typeB 仅判断,用于判断A是否是B类型,或者是B类型的子类
typeA as
typeB 先判断再转换,判断成功则转换,否则设置A为NULL
is as可以用来验证继承关系是否合理 (can do接口)
as关键字只能用来转换引用类型
结构体
是一个值类型,非常像类的一种值类型,允许用户自定义的值类型
值类型主要用来封装一组数据,并为数据提供一些简单的处理方法
引用类型主要用来封装数据和行为
结构体使用时可以new,也可以不new,并且成员不能是私有的,结构在使用new关键字创建对象后,所有的成员变量都已经存在,并有默认值,如果没有用new关键字,则需要程序员手动为所有变量赋值,之后才能调用结构对象里的方法属性
如果需要使用面向对象的特性,则不能使用结构体,需使用类了,当类型中的成员比较多时,也需考虑使用类
在结构声明中,除非字段被声明为const或static,否则无法初始化
结构不能声明无参数构造函数,只能声明带参数的构造函数
结构不能继承,系统定义结构继承自ValueType-Oject,结构在赋值时,是值传递
结构可以实现接口
类里面的成员是放在堆里面的,只有方法中的变量才放在栈里面,方法进行完就立马销毁
==比较时,如果比较的是值类型,则比较两个变更的值,如果比较的是引用类型,则比较的是地址,也就是说比较栈中的内容
Equals在Object中是虚方法,默认用==进行比较我,但是大部分微软的类,及用户自定义的类,都重写了该方法,也就是微软和用户各为自己编写了object的子类定义了相等比较规则,即是值
析构函数
GC会每隔一段时间来查看托管堆里是否有没有被引用的对象,如果有,则销毁,释放对象所占用的内在空间
不能在结构中定义析构函数,只能对类使用析构函数
一个类只能有一个析构函数,无法继承或重载析构函数,无法手动调用,是系统自动调用的,没有修饰符及参数
程序集:就是程序代码的打包,包括所有代码的中间语言,及项目清单
CLR执行步骤:
1.加载源文件
2.将C#代码编译为中间语言
3.生成程序集,包含项目的所有类的中间代码
4.加载程序集,加载程序集中所有的类,查找程序集中的Main()方法,然后运行
原文地址:http://www.cnblogs.com/wuchunhu/p/3763865.html