一:分部类
关键字:Parital,
定义:将类、结构、接口拆分到两个或多个源文件中
注意:
1、只能把类、结构、接口分开到不同的文件中
2、各个部分必须有相同的访问性
3、各个部分都必须使用Partial
4、如果有一个部分为抽象的则整个都为抽象的
5、如果有一部分继承某个类或实现某个接口则整个都继承这个类或实现这个接口
6、各个部分实现某个接口则整个都实现这些接口
7、虽然我们把这个类放到了不同的文件中但是可以按正常方式使用这个类
8、类中的嵌套类也是可以实现分部的
9、Parital只能用在class、struct、interface前面的位置
10、必须放在同一个程序集里
11、类名和泛型类型参数在所有分部类型定义中必须匹配
public static IEnumerable Power(int number,int exponent)
{
int counter = 0;
int result = 1;
while (counter++ < exponent)
{
result = result * number;
yield return result;
}
}
三:可空类型
定义:这个类型的值非常有用,可以表示其基础值类型正常范围内的值,再加上一个null值
作用:比如以前数据库中某个字段是支持空类型的,但是我门DataSet却不支持空,我门不得不遇到空值加个如1900年来表示空,现在有了可空类型就不需要了,空就是空。
表示形式:如Nullable<Int32>,读作可空的Int32
例子:Nullable<int> num = null 它等于 int?num = null,它两没区别
注意:
1、int?x = null;
int y = x ?? -1;
这里如果不采用??就会出错,因为如果x为空那它减1就会出错,所以这里加?? 表示如果x为空就用x的默认值0减1等于-1,它编译就不会出错了
2、可空类型的类型必须是值类型就是说你不能传个空的给它
四:匿名方法
产生前提:
有这么一句话:timer1.Elapsed += new ElapsedEventHandler(timer1_Elapsed);
以前我为了给timer1的Elapsed事件实例化一个ElapsedEventHandler委托把timer1_Elapsed方法传给他,我的timer1_Elapsed方法的签名必须和这个委托签名一致我不得不这么做:
private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
弹出一句话
}
但是有可能我这个方法只做了弹出一句话这个事情,而我声明的这些参数就没有必要。
到了.net2.0就可以变成这样了:
timer1.Elapsed += delegate(object sender, System.Timers.ElapsedEventArgs e){弹出一句话}
好处:如果使用匿名方法则不必创建单独的方法,因此减少了实例化委托所需的编码系统开销。
注意:
1、匿名方法不能访问外部范围的ref或out参数
2、匿名方法快中不能访问任何不安全代码
五:属性访问器可访问性
1、产生背景
string str = "";
public string TestProp
{
get{return str;}
set{str = value;}
}
我们以前get和set的可访问性是和public修饰符关联的,这里表示get和set都是可访问的,现在我希望哪里都可以get但是set只能在其派生类里访问
在.net2.0中可以这样:
string str = "";
public string TestProp
{
get{return str;}
protected set{str = value;}
}
注意:
1、接口不能使用修饰符,因为接口所有的属性都应该是公开的。
2、接口未定义的访问器可以使用修饰符
3、仅当属性或索引器同时具有set和get访问器时才能使用访问器修饰符并且只允许对其中一个访问器使用修饰符。
3、访问器的可访问性级别必须比属性或索引器本身的可访问性级别具有更严格的限制。
4、重写的属性访问器必须和虚礼方法中的访问器修饰符匹配
六:命名空间别名限定符
关键字:命名空间别名限定符是双冒号(::)
产生背景:当我们自己定义的命名空间和系统的命名空间产生冲突时我门用命名空间别名限定符就表示将调用全局命名空间中去查找,而不是在别名命名空间中查找
如:
class System{}
global::System.Console.WriteLine("Hello World");