------------------------
★
Foreach :
------------------------
★base 关键字用于从派生类中访问基类的成员:
-
调用基类上已被其他方法重写的方法。
-
指定创建派生类实例时应调用的基类构造函数。
------------------------
★sealed关键字的作用:
在类声明中使用sealed可防止其它类继承此类;在方法声明中使用sealed修饰符可防止扩充类重写此方法。
sealed修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说来,由于密封类永远不会有任何派生类,所以对密封类的实例的虚拟函数成员的调用可以转换为非虚拟调用来处理。
密封类:
密封类在声明中使用sealed 修饰符,这样就可以防止该类被其它类继承。如果试图将一个密封类作为其它类的基类,C#将提示出错。理所当然,密封类不能同时又是抽象类,因为抽象总是希望被继承的。
密封方法:
C#还提出了密封方法(sealedmethod) 的概念,以防止在方法所在类的派生类中对该方法的重载。对方法可以使用sealed 修饰符,这时我们称该方法是一个密封方法。
------------------------
★C#不支持参数默认值,如果要实现相同功能,请使用函数重载。
如:
void MsgBox(string msg, string title)
{
MessageBox.Show(msg, title);
}
void MsgBox(string msg)
{
MsgBox(msg, "消息"); // "消息" 即是 title 参数的默认值。
}
------------------------
★索引器(Indexer)
索引器(Indexer)是C#引入的一个新型的类成员,它使得类中的对象可以像数组那样方便、直观的被引用。索引器非常类似于属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用。定义了索引器的类可以让您像访问数组一样的使用 [ ] 运算符访问类的成员。(当然高级的应用还有很多,比如说可以把数组通过索引器映射出去等等)
索引器概述
-
索引器使得对象可按照与数组相似的方法进行索引。
-
get 访问器返回值。set 访问器分配值。
-
this 关键字用于定义索引器。
-
value 关键字用于定义由 set 索引器分配的值。
-
索引器不必根据整数值进行索引,由您决定如何定义特定的查找机制。
-
索引器可被重载。
-
索引器可以有多个形参,例如当访问二维数组时。
------------------------
★命名空间与装配件的关系
Assembly是一个程序集相关的静态类,保存了程序集的信息 //此叙述不一定正确
Assembly的主要用处是:
ⅰ与反射Reflection结合起来用,动态创建你所需要的类!!
ⅱ与反射Reflection结合起来用,获得Assemble里类的信息
(据可靠的小道消息说Assembly里存的是一张包含元数据类名什么的表)
ⅲ使用别人已封装好的类.
装配件是.Net应用程序执行的最小单位,编译出来的.dll、.exe都是装配件。
装配件和命名空间的关系不是一一对应,也不互相包含,一个装配件里面可以有多个命名空间,一个命名空间也可以在多个装配件中存在.
Type.GetType属于Reflection的一部分,Reflection可以用于动态解析类型。也就是说,即使编译开发期间没有建立对Assembly的引用,Type.GetType一样可以用于取得类型信息(相反,typeof是静态解析类型的,所以要求reference)。
Type.GetType: 单从类型的名称(包括Namespace部分)是不可能找到类型定义的,还必须知道定义类型的Assembly的名称和位置。所以在调用Type.GetType的时候必须要附带指明Assembly的信息。
如何使用反射获取类型
如何获得类型信息:
获得类型信息有两种方法,一种是得到实例对象
这个时侯我仅仅是得到这个实例对象,得到的方式也许是一个object的引用,也许是一个接口的引用,但是我并不知道它的确切类型,我需要了解,那么
就可以通过调用System.Object上声明的方法GetType来获取实例对象的类型对象,比如在某个方法内,我需要判断传递进来的参数是否实现了某个接口,如果
实现了,则调用该接口的一个方法:
…
public void Process( object processObj )
{
Type t = processsObj.GetType();
if( t.GetInterface(“ITest”) !=null )
…
}
…
另外一种获取类型的方法是通过Type.GetType以及Assembly.GetType方法,如:
Type t = Type.GetType(“System.String”);
需要注意的是,前面我们讲到了命名空间和装配件的关系,要查找一个类,必须指定它所在的装配件,或者在已经获得的Assembly实例上面调用
GetType。
本装配件中类型可以只写类型名称,另一个例外是mscorlib.dll,这个装配件中声明的类型也可以省略装配件名称(.Net装配件编译的时候,默认都
引用了mscorlib.dll,除非在编译的时候明确指定不引用它),比如:
System.String是在mscorlib.dll中声明的,上面的Type t = Type.GetType(“System.String”)是正确的
System.Data.DataTable是在System.Data.dll中声明的,那么:
Type.GetType(“System.Data.DataTable”)就只能得到空引用。
必须:
Type t = Type.GetType("System.Data.DataTable,System.Data,Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
http://expert.csdn.net/Expert/topic/2210/2210762.xml?temp=.1919977
------------------------
★如何在访问类的 保护成员
使用扩展方法,访问类成员
------------------------
★支持绑定数据源的接口:窗体数据绑定模型。必须实现下列接口之一的任何类型:
IList 接口,包括一维数组,ArrayList也是。
IListSource 接口,例如,DataTable 和 DataSet 类。
IBindingList 接口,例如,BindingList 类。
IBindingListView 接口,例如,BindingSource 类。
如果把其它的东西当做数据源,就会出现(复杂的 DataBinding 接受 IList 或 IListSource 作为数据源。)。。等错误
------------------------
★关键字 params- 描述参数数组个数可变,用于数组参数的维数不定的情况,并且必须放在所有参数的后面。使用规格:方法名(param1,..,params 可变参数类型[] 参数名)
------------------------
★
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern short GetAsyncKeyState(int vkey);
private const int KEY_PRESSED = 0x1000;
[DllImport("user32.dll")]
static extern short GetKeyState(int nVirtKey);
/// <summary>
/// Get X in the accessor key "Alt + X"
/// </summary>
/// <returns></returns>
private static int CheckForAccessorKey()
{
Keyboard keyboard = new Keyboard();
if (keyboard.AltKeyDown)
{
for (int i = (int)Keys.A; i <= (int)Keys.Z; i++)
{
if ((GetKeyState(i) != 0 && KEY_PRESSED != 0))
{
return i;
}
}
}
return -1;
}
------------------------
★
搜索指定的字符串,以确定指定字符是否是分配给此控件的助记键字符
Control.IsMnemonic('c', Control.Text)//"(&c)button4"