1、 局部变量不自动初始化,而属性的每个字段有个默认初始值,是C#在没有指定初始值时提供。
2、 char/byte/sbyte/short/ushort/int/uint/long/ulong/float/double与decimal类型实例变量的默认值都是0.bool类型实例变量的默认值为假。同样,引用类型实例变量的默认值为null
3、 C#不允许静态方法直接调用非静态成员
4、 一个类中可以声明同名方法,只要其参数集不同(参数个数、类型和顺序),称为方法重载(与返回类型无关)
5、 参数声明中使用关键字ref可以按引用将变量传递给方法------被调用方法可以修改调用者的变量(ref关键字用于调用方法中已经初始化的变量。)
在参数前面加上关键字out可以建立输出参数,告诉编译器这个变元按引用传入被调方法,被调方法对调用者的原变量赋值
6、 数组索引值应为int、uint、long、ulong类型或可以隐式升级为这些类型的值
7、 一维数组:
int[] b = new int[10];
b = {十个数};
or
int[] b = {十个数};
多维数组:
(1)矩形数组:
int[ , ] b;
b = new int[ 2, 2 ];
or
int[ , ] b = { { 1, 2 }, { 3, 4 } };
(2)齿轮数组:
int[][] c= { new int[] { 1, 2 }, new int[]{ 3 }, new int[]{ 4, 5, 6 } };
or
int[][] c;
c = new int[ 3 ][ ];
c[ 0 ] = new int [ 2 ];
c[ 1 ] = new int [ 1 ];
c[ 2 ] = new int [ 3 ];
注:齿状数组不能用一个数组生成表达式完全创建。例如下面的语法错误:
int[][] c = new [ 2 ][ 3 ]; //error
8、 矩形数组,每个for语句的循环继续条件用矩形数组的GetLength方法取得每一维的长度。维号从0开始。因此方法调用GetLength(0)返回数组第一维的长度(行数),GetLength(1)返回数组第二维的长度(列数)。
齿轮数组:外for语句的循环继续条件用属性array.Length确定数组行数。内for语句的循环继续条件用属性array[row].Length确定数组列数。(这里的array是数组名,row为行数)
9、 如果类成员没有用访问修辞符声明,则其默认为private。我们总是显式声明private成员
10、 get与set方法前面没有访问修辞符时,访问方法继承属性名前面的访问修饰符
11、声明与使用可复用类的步骤:
1)、声明一个公用类。如果不是公用类,则只能让同一个汇编中的其他类来使用。
2)、选择名字空间名并在源代码文件中增加一个名字空间声明,表示可复用类声明
3)、将类编译进类库(创建的工程是Class Library)
4)、在程序中增加类库的引用
5)、用using指令指定可利用类名字空间和使用这个类
12、Class View 与Object Browser(VS2005 IDE的使用)
Class View显示工程中所有类的字段与方法。
Object Browser列出C#库中所有的类。
13、现有类是基类,新类是派生类。每个派生类又可以作为其他派生类的基类。
C#与C++不同,不支持多重继承(而接口则可以,从而避免相关问题。
派生类的对象也可以作为基类的对象。
关键字virtual与abstract表示派生类中可以覆盖基类方法。
override修饰符声明派生类方法覆盖virtual与abstract基类方法。这个修饰符还隐式声明派生类方法为virtual(也就是说被override过的派生类方法隐式为virtual)。
14、派生类对象可以看成是基类对象,而基类对象不是派生类对象。(“是”关系适用于从派生类到直接或间接基类,但反过来不行)。
构造函数和静态方法不能声明为abstract
15、if(a)其实就是a为真时成立,其详写为if( a == true );if(!a)也就是a的值为假时成立,其详写为if( a != true )(之前老把这个搞混了,所以也加上,就当是自己又复习一遍)
16、整除得到整数商,但要注意整除放弃小数部分(截尾),而不是四舍五入。比如:20/3是6;而当20.0/3或者是20/3.0时,得到的数则是一个浮点数来的,最后一位浮点数则是四舍五入得来。当对一个浮点数的结果进行整数的强制类型转换时,所得到的值就是结果的小数部分被截尾。比如:(int)(20.0/3)=6。
17、变元提升与类型转换:
类型 | 转换类型 |
bool | 不能隐式转换成其它简单类型 |
byte | ushort、short、uint、int、ulong、long、decimal、float或double |
char | ushort、int、uint、ulong、decimal、float或double |
decimal | 不能隐式转换成其它简单类型 |
double | 不能隐式转换成其它简单类型 |
float | double |
int | long、decimal、float或double |
long | decimal、float或double |
sbyte | short、int、long、decimal、float或double |
short | int、long、decimal、float或double |
uint | ulong、long、decimal、float或double |
ulong | decimal、float或double |
ushort | uint、int、ulong、long、decimal、float或double |
默认情况下,如果目标类型不能表示原类型,则C#不允许在它们之间进行隐式转换(例如,int值2 000 000不能表示为short值,任何有小数的浮点数不能用long,int或short之类整数表示),否则会产生编译错误。但是如果我们知道这个转换可能丢失信息,但这里可以这么做的话,则可以用强制类型转换来实现。