【C#4.0图解教程】笔记(第9章~第18章)

第9章 语句
1.标签语句
①.标签语句由一个标识符后面跟着一个冒号再跟着一条语句组成
②.标签语句的执行完全如同标签不存在一样,并仅执行冒号后的语句.
③.给语句添加一个标签允许控制从代码的另一部分转移到该语句.
④.标签语句只允许用在块内部.
⑤.标签名允许与其他标识符重名,但不允许与标签名同名.
 
2.goto语句
该语句无条件转移控制到一个标签语句
 
3.using语句
eg:
eg:using语句的另一种形式
虽然这种形式也能确保对资源的使用结束后Dispose方法总是被调用,但它不能防止你在using语句已经释放了它的非托管资源之后使用该资源,把它留在一种不一致的状态,因此它提供了较少的保护,而且不推荐使用.
 
 
 
 
第10章 命名空间和程序集
1.用using给命名空间添加别名
eg:
 
这一章感觉不是很重要,所以过
 
 
 
 
第11章 异常
1.捕获异常的基本代码(可以有多个catch语句块)
try
{ }
catch (IndexOutOfRangeException e)
{ }
finally
{ }
 
2.异常类
所有异常类都派生自using System.Exception类.
 
3.throw语句
使代码显式引发一个异常.
语法:
throw ExceptionObject;
eg:
eg:不带异常对象的抛出,这种形式只能在catch语句内部.
 
 
 
 
第12章 结构
1.结构是值类型
关键字struct
结构类型的变量不能为null;
两个结构变量不能引用同一个对象;
 
2.结构的构造函数和析构函数
eg:
 
3.在结构里的字段初始化时不允许的
eg:
 
4.结构是密封的
结构总是隐式密封的,因此,结构不能被继承.
以下修饰符不能用于结构(因为无意义)
●protected
●internal
●abstract
●virtual
 
 
 
 
第13章 枚举
1.与结构一样,枚举是值类型,因此直接存储它们的数据,而不是分开存储成引用和数据.
2.枚举只有一种类型的成员:命名的整数值常量.
3.每个枚举类型都有一个底层整数类型,默认为int
eg:
eg:
 
 
 
 
第14章 数组
1.一维,矩形,交错数组
 
2.数组是对象
数组实例是从System.Array继承的对象,数组对象本身总是在堆上.
●属性Length表示返回数组长度.
●属性Rank表示返回数组维度数.
 
3.实例化和初始化一维数组或矩形数组
eg:一维的,mcArr数组是4个MyClass类引用的一维数组
eg:多维的
快捷语法:
eg:
 
4.隐式类型数组(Var)
eg:
 
5.注意
 
6.foreach
迭代变量是只读的,所以它不能被改变
虽然不能改变引用,但可以通过迭代变量改变数据.
eg:这样是错误的
eg:这样是可以的
 
7.数组协变
在某些情况下,即使某个对象不是数组的某类型,我们也可以把它赋值给数组元素,这种属性叫做数组协变.
值类型数组没有协变
eg:
 
8.数组继承的一些有用成员
 
 
 
 
第15章 委托
1.声明委托类型
●以delegate关键词开头
没有方法主体.
eg:
 
2.创建委托对象
eg:
简洁方法:
 
3.为委托添加和移除方法
添加用+=运算符
移除用-=运算符
为委托添加和移除方法,其实是变量指向一个全新的委托,因为委托对象被创建后不会再被改变.
 
4.综合实例
eg:
eg:
 
5.匿名方法
语法:
●.delegate类型关键字
●.参数列表,如果语句块没有使用任何参数则可以忽略.
●.语句块,它包含了匿名方法的代码.
●.实现代码本身的行为必须通过返回一个在类型上与委托返回类型相同的值来匹配委托的返回类型.如果委托有void类型的返回值,则匿名方法就不能有返回值.
eg:
eg:也可以通过是圆括号为空或省略圆括号来简化匿名方法的参数列表.但是必须满足(委托的参数列表不包含out参数,匿名方法不使用任何参数.)这两个条件.
 
6.params参数
如果委托声明的参数列表包含了params参数,那么params关键字就会被匿名方法的参数列表忽略.
 
7.Lambda表达式
eg:le1到le4都等价
 
 
 
 
第16章 事件
1.声明事件
 
2.订阅事件
使用+=运算符来为事件添加事件处理程序.
使用-=运算符来移除事件处理程序.
eg:
 
3.标准事件的用法
事件使用的标准模式的根本就是System命名空间声明的EventHandler委托类型.EventHandler委托类型的声明如下面代码所示.
public delegate void EventHandler(object sender,EventArgs e);
●第一个参数用来保存触发事件的对象的引用.由于是object类型的,所以可以匹配任何类型的实例.
●第二个参数用来保存有关状态对于应用程序来说是否合适的状态信息.
●返回类型是void
 
4.EventArgs类
System.EventArgs是包含事件数据的类的基类
eg:
using System;
 
public class MyTCEventArgs : EventArgs  //继承EventArgs类,EventArgs是包含事件数据的类的基类
{
    public string Message;
    public MyTCEventArgs(string s)//构造函数
    {
        Message = s;
    }
}
 
public class MyTimerClass
{
    public event EventHandler<MyTCEventArgs> Elapsed;//泛型委托事件声明
    private void OnOneSecond(object source, EventArgs args)//发起事件的代码
    {
        if (Elapsed != null)//判断事件是否不为空
        {
            MyTCEventArgs mtcea = new MyTCEventArgs("message from ononesecond");
            Elapsed(source, mtcea);//触发事件,它有两个参数是由声明时EventHandler委托决定的,它是一个.NET BCL使用的预定义的用于标准事件的委托.所以一般都是两个参数
        }
    }
  
    private System.Timers.Timer MyprivateTimer; //私有计时器
    public MyTimerClass()//构造函数
    {
        MyprivateTimer = new System.Timers.Timer();//初始化私有计时器
        //下面语句将上面的OnOneSecond设置成了类计时器的Elapsed事件的事件处理程序.
        //它与我们上面声明的Elapsed事件完全无关.
        MyprivateTimer.Elapsed += OnOneSecond;//附加事件处理程序.
        MyprivateTimer.Interval = 1000;//每秒调用一次.
        MyprivateTimer.Enabled = true;
    }
}
 
class ClassA
{
    public void TimerHandlerA(object sourse, MyTCEventArgs args)//事件处理程序,注意两个参数
    {
        Console.WriteLine("Class A Message: {0}", args.Message);
    }
}
class Program
{
    static void Main()
    {
        ClassA ca = new ClassA();
        MyTimerClass mc = new MyTimerClass();
        mc.Elapsed += new EventHandler<MyTCEventArgs>(ca.TimerHandlerA);//注册事件处理程序
        Console.ReadKey();
    }
}
 
5.事件访问器
联想get和set访问器
 
 
 
 
第17章 接口
1.接口概念
关键字 interface
接口是表示一组函数成员而不实现成员的引用类型
 
2.声明接口
接口声明不能包含数据成员.
接口声明只能包含如下类型的静态成员函数的声明:
●方法
●属性
●事件
●索引
③函数成员的声明不能包含任何实习的代码
④接口的成员是隐式public,不允许有任何访问修饰符.
 
3.接口是引用类型
通过把类对象引用强制转换为接口类型来获取指向接口的引用.
eg:
using System;
 
interface IIfc1
{
    void printout(string s);
}
 
class A:IIfc1
{
    public void printout(string s)
    {
        Console.WriteLine("Calling throught From A:{0}", s);
    }
}
 
class B : IIfc1
{
    public void printout(string s)
    {
        Console.WriteLine("Calling throught From B:{0}", s);
    }
}
 
class Program
{
    static void Main()
    {
        A a = new A();
        B b = new B();
 
        a.printout("A");
        b.printout("B");
 
        IIfc1 ifc = (IIfc1)a;
        ifc.printout("interface");
 
        IIfc1 ifc2 = b as IIfc1;//使用as运算符会更好,因为as运算符转换没有实现该接口的类时,返回NULL而不会抛出异常,强制转换则会.
        ifc2.printout("inferface2");
 
        Console.ReadKey();
    }
}
 
4.实现重复成员的接口
如果一个类实现了多个接口,其中有一些接口有相同签名和返回类型的成员,那么类可以实现单个成员来满足所有包含重复成员的接口.
如果想实现不同接口中的相同成员实现不同代码,可以'显式接口成员实现'
eg:在MyClass内访问PrintOut方法则要使用((IIfc1)this).PrintOut("....");代码,因为显式接口成员实现只可以通过指向接口的引用来访问.
 
5.派生成员作为实现
实现接口的类可以从它的基类继承实现的代码.
eg:即使Derived的声明主体是空的,基类中的代码还是能满足实现接口方法的需求.
 
 
 
 
第18章 转换
1.溢出检测上下文
关键字unchecked与checked运算符
checked运算符:用于控制整型算术运算和转换的溢出检查上下文
unchecked运算符:用于禁止溢出检测
eg:unchecked与checked运算符
eg:unchecked与checked语句,用法不同,但概念与运算符一样
 
2.装箱拆箱转换
装箱:值类型转换为引用类型
拆箱:引用类型转换为值类型
装箱产生之后,有两份值——原始值类型和副本的引用类型,每个都是可以独立操作的.
eg:
 
3.用户自定义转换(之前讲过)
eg:
 
4.is运算符
该运算符用来检查转换是否会成功完成,从而避免盲目尝试转换.
is运算符只可以用于引用转换以及装箱和拆箱转换,不能用于用户自定义转换
eg:
 
5.as运算符
as运算符和强制转换运算符类似,只是它不抛出异常,如果转换失败,它返回null而不是抛出异常.
和is运算符一样,只能用于引用转换和装箱拆箱转换,不能用于用户自定义转换和值类型转换.
eg:
 
 
posted @ 2013-09-14 15:14  漂移青春  阅读(291)  评论(0编辑  收藏  举报