[]
特征:针对特定类型、固定长度的
Array
特征:针对任意类型、固定长度的
List
特征:针对特定类型、任意长度的
ArrryList
特征:针对任意类型、任意长度的
C# 数组中每个元素的类型必须相同
C# 数组的下标是从 0 开始
一维数组
int[] arr = {1, 2, 3};
多维数组
int[,] arr = { {1, 11}, {2, 12}, {3, 13} };
交错数组
int[][][] arr = new int[1][][];
GridView
特征:一行一条记录,就像新闻列表一样;带分页功能
DataList
特征:一行可以有多条记录,就像图片列表一样;分页功能需要手写
Repeater
特征:自由定制;分页功能需要手写
ListView
特征:自由定制,功能强大;应用复杂;分页功能需要手写
DetailsView 控件
特征:一条记录,一行一个字段;带分页功能
FormView
特征:一条记录,自由定制;带分页功能
C# 3.0 - var 隐式类型声明
C# 3.0 -自动属性实现
C# 3.0 -对象初始化设置
C# 3.0 -集合初始化设置
C# 3.0 -匿名类型
C# 3.0 -扩展方法
C# 3.0 - partial 分部(类型)
C# 3.0 - Lambda
重载
必须位于同一个类中;
方法名称必须相同;
方法的参数要么类型不同,要么个数不同,要么类型个数均不同;
返回值类型可以不同;
隐藏
必须位于基类和派生类中;
方法名称必须相同;
参数类型、参数个数必须相同;
返回值类型可以不同;
应该使用 new,虽然不使用 new 也会运行,但在编译时会被警告;
调用派生类方法还是基类方法,取决于被什么类型的实例调用。
覆盖
必须位于基类和派生类中;
方法名称必须相同;
参数类型、参数个数必须相同;
返回值类型必须相同(与隐藏不同);
必须使用关键字 virtual 和 override;
即使把派生类的实例转换成基类类型,也无法调用基类中被覆盖的方法,因为它已经被覆盖了嘛,不像隐藏还有被“发掘”的机会。
抽象
可对类用 abstract,不对其方法用 abstract;
但若对方法用 abstract,其类必须用 abstract;
若类用了 abstract,方法没用 abstract,不表示方法也是 abstract;
不能使用 new 来实例化抽象类;
抽象方法不能有主体,只需要在参数写完后,直接收括号,引号结束;
抽象的方法是隐式的 virtual 方法,所以它还有覆盖(改写、重写)的特点。
接口
一个接口定义了一个契约。
接口可以包容方法、C# 属性、事件、以及索引器。
在一个接口声明中,我们可以声明零个或者多个成员。
所有接口成员的默认访问类型都是 public。
如果在接口成员声明中包括了任何修饰符,那么会产生一个编译器错误。
与一个非抽象类类似,一个抽象类必须提供接口中所有成员的实现,只要这些成员在这个类的基类中出现过。
partial
分部(类型) 可以在任意一个类中声明 partial类型的方法 编译之后这些方法将合并
char
char 关键字用于声明 U+0000 到 U+ffff 的 16 位 Unicode 字符。Unicode 字符是 16 位字符,用于表示世界上多数已知的书面语言,char 可以隐式转换为 ushort、int、uint、long、ulong、float、double 或 decimal。但是,不存在从其他类型到 char 类型的隐式转换。注意是隐式转换。
为 char 类型变量赋值有四种方法:
char c1 = 'X'; //注意是单引号
char c2 = '\x0058'; //用十六进制表示
char c3 = (char)88; //用数字转换
char c4 = '\u0058'; //用 Unicode 表示
float
float 是 4 个字节数,表示浮点数,它的表示方法,需要在数字后加“f”,大小写不敏感
如:float f = 3.2f/float f = 3.2F;
decimal
小数型)是一种高精度的 128 位数据类型,它所表示的范围从 1.0*10-28 到大约 7.9*1028。它的表示方法,需要在数字后加“m”,大小写不敏感
如decimal m = 1.0m/decimal m = 1.0M;
值类型
值类型有:byte(1)、sbyte(1)、short(2)、ushort(2)、int(4)、uint(4)、long(8)、ulong(8)、float(4)、double(8)、decimal(8)、char、bool、枚举、结构。
上述中括号中的数字表示字节数,byte、ushort、uint、ulong 为无符号类型(没有负数),顺便说一下 sbyte 是有符号的字节。
这些类型是.NET Framework 类型的别名的别名,具体对应关系,请参见由 String 与 string 引出的。
引用类型
引用类型有:对象类型、类类型、接口、代表元、字符串类型、数组。
虽然字符串类型(string)是引用类型,但微软为了我们设计方便,重载了其中的一些操作符,使得它应用起来就像是值类型一样。
yield
yield 关键字会告诉编译器当前的函数是在一个循环内部,编译器会相应生成一个执行它在循环体内部所表示行为的类,yield 和 return 关键字一起用于为枚举器对象提供返回值,比如说:在 foreach 内部的每一次循环内,yield 关键字用于终止当前循环
var
自从 C# 3.0 开始,在函数作用局范围内声明的变量可以通过 var 关键字声明成隐含类型 , 隐含类型是强类型,你需要自己声明隐含类型本地变量,然后编译器会帮你决定为某种强类型。在 2.0 版本上跑的程序也可以使用 var 关键字,但是需要你的编译器是 3.0 以上版本并且设置代码输出版本为 2.0
using()
定义一个范围,在范围外的对象将会被回收
readonly
readonly 关键字是一个可作用在变量域上的修饰符,当一个变量域被 readonly 修饰后,这个变量只可在声明或者当前变量所属类的构造器内赋值
as
as 操作符很像一个类型转换器,然和,当转换无法发生时,as 会返回 null 而不是抛出一个异常
default
在泛型类和泛型方法中产生的一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型 T:T 是引用类型还是值类型。如果 T 为值类型,则它是数值还是结构。给定参数化类型 T 的一个变量 t,只有当 T 为引用类型时,语句 t = null 才有效;只有当 T 为数值类型而不是结构时,语句 t = 0 才能正常使用。解决方案是使用 default 关键字,此关键字对于引用类型会返回 null,对于数值类型会返回零。对于结构,此关键字将返回初始化为零或 null 的每个结构成员,具体取决于这些结构是值类型还是引用类型 :
T temp = default(T);
global
在 :: 运算符前面使用的 global 上下文关键字引用全局命名空间,该命名空间是任何 C# 程序的默认命名空间,未以其他方式命名。
class TestClass : global::TestApp { }
volatile
表示字段可能被多个并发执行线程修改。声明为 volatile 的字段不受编译器优化(假定由单个线程访问)的限制。这样可以确保该字段在任何时间呈现的都是最新的值
extern alias
有时可能有必要引用具有相同完全限定类型名的程序集的两个版本,例如当需要在同一应用程序中使用程序集的两个或更多的版本时。通过使用外部程序集别名,来自每个程序集的命名空间可以在由别名命名的根级别命名空间内包装,从而可在同一文件中使用
http://msdn.microsoft.com/en-us/library/ms173212%28VS.80%29.aspx
返回类型说明
4.如果返回的集合要支持索引,但不能添加,删除元素,用ReadOnlyCollection<T>