1. definition
class
TestClass
{
//
methods, properties, fields, events, delegates
//
nested classes, only nested class can use: protected and private
}
2. inherit
class
ClassA { }
//
无继承
class
DerivedClass: Base Class { }
//
单一继承
class
InterClass: Int1, Int2 { }
//
接口继承
class
IDClass: BaseClass, Int { }
//
复合继承
3. Members
Constructor
Destructor
不能在结构中定义析构函数。只能对类使用析构函数;
一个类只能有一个析构函数; 无法继承或重载析构函数; 无法调用析构函数。它们是被自动调用的; 析构函数既没有修饰符,也没有参数.
程序员无法控制何时调用析构函数,因为这是由垃圾回收器决定的。垃圾回收器检查是否存在应用程序不再使用的对象。如果垃圾回收器认为某个对象符合析构,则调用析构函数(如果有)并回收用来存储此对象的内存。程序退出时也会调用析构函数。
可以通过调用 Collect 强制进行垃圾回收,但大多数情况下应避免这样做,因为这样会导致性能问题。
不应使用空析构函数。如果类包含析构函数,Finalize 队列中则会创建一个项。调用析构函数时,将调用垃圾回收器来处理该队列。如果析构函数为空,只会导致不必要的性能损失
class
Car
{
~
Car()
//
destructor
{
//
cleanup statements
}
//
该析构函数隐式地对对象的基类调用 Finalize。这样,前面的析构函数代码被隐式地转换为以下代码:
protected
override
void
Finalize()
{
try
{
//
Cleanup statements
}
finally
{
base
.Finalize();
}
}
}
Constant
Field
Method
Property
Indexer
class
SampleCollection
<
T
>
{
private
T[] arr
=
new
T[
100
];
public
T
this
[
int
i]
{
get
{
return
arr[i];
}
set
{
arr[i]
=
value;
}
}
}
Operator
Event
Delegate
Class
Interface
Struct
3. Generic Class
class
BaseNode { }
class
BaseNodeGeneric
<
T
>
{ }
//
concrete type
class
NodeConcrete
<
T
>
: BaseNode { }
//
closed constructed type
class
NodeClosed
<
T
>
: BaseNodeGeneric
<
int
>
{ }
//
open constructed type
class
NodeOpen
<
T
>
: BaseNodeGeneric
<
T
>
{ }
泛型类封装不是特定于具体数据类型的操作,最常用于集合。
//
No error
class
Node1 : BaseNodeGeneric
<
int
>
{ }
//
Generates an error
//
class Node2 : BaseNodeGeneric<T> {}
//
Generates an error
//
class Node3 : T {}
非泛型类(换句话说,即具体类)可以从封闭式构造基类继承,但无法从开放式构造类或裸类型形参继承,因为在运行时客户端代码无法提供实例化基类所需的类型实参
class
BaseNodeMultiple
<
T, U
>
{ }
//
No error
class
Node4
<
T
>
: BaseNodeMultiple
<
T,
int
>
{ }
//
No error
class
Node5
<
T, U
>
: BaseNodeMultiple
<
T, U
>
{ }
//
Generates an error
//
class Node6<T> : BaseNodeMultiple<T, U> {}
从开放式构造类型继承的泛型类必须为任何未被继承类共享的基类类型参数提供类型变量
void
Swap
<
T
>
(List
<
T
>
list1, List
<
T
>
list2)
{
//
code to swap items
}
void
Swap(List
<
int
>
list1, List
<
int
>
list2)
{
//
code to swap items
}
开放式构造类型和封闭式构造类型可以用作方法参数
如果某个泛型类实现了接口,则可以将该类的所有实例强制转换为该接口。
泛型类是不变的。也就是说,如果输入参数指定 List<BaseClass>,则当您尝试提供 List<DerivedClass> 时,将会发生编译时错误。
详见:http://msdn.microsoft.com/zh-cn/library/0b0thckt.aspx