一、《C#学习笔记》
目录:C06 接口(interface)
C08 委托(delegate)
C09 事件(Event)
C10 类型
C11 泛型(Generic)--使类型参数化
C12 可空类型、匿名方法和迭代器
C14 Lambda表达式
C15 扩展方法--使类的扩展更简单:(Extension Method)
C16 LINQ--数据操作So easy
C17 C#4.0中的微小改动
C18 动态类型(dynamic)
C19 多线程编程
C20 异步编程
C21 出师前闯关训练第一关--文件操作
C22 出师前闯关训练第二关--网络编程
C23 出师前闯关训练最后一关--使用GDI+实现属于你的截图工具
C06 接口(interface):
接口可以理解为对一组方法声明进行的统一命名,但这些方法没有提供任何实现。
通过接口,可以对方法进行统一管理,避免了在每种类型中重复定义这些方法。
C08 委托(delegate):
1.委托(delegate)
委托定义:"委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,
可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。"
使用委托的步骤为:1.定义委托类型->2.声明委托变量->3.实例化委托->4.作为参数传递给方法->5.调用委托。
委托的最大作用:委托使得一个方法可以作为另一个方法的参数进行传递。
引入委托之后,可以把函数作为参数传递给另一个方法,委托可以提高方法扩展性。
2.委托链
C#中把封装多个方法的委托称为委托链或多路广播委托。
C09 事件(Event):
定义:事件基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些出现,如系统生成的通知。
应用程序需要在事件发生时响应事件。例如,中断。事件是用于进程间通信。
事件定义的结构:访问修饰符 event 委托类型 事件名;例如:public event EventHandler birthday
订阅和取消事件:
C10 类型:
值类型和引用类型:
值类型:主要包括简单类型、枚举类型、结构体类型等。值类型的实例通常被分配在线程的堆栈上,变量保存的内容就是实例数据本身。
引用类型:主要包括类类型、接口类型、委托类型和字符串类型等。引用类型的实例则被分配再托管堆上,变量保存的是实例数据的内存地址。
C11 泛型(Generic)--使类型参数化:
泛型代表的就是"通用类型",它可以代替任意的数据类型,使类型参数化,从而达到只实现一个方法就可以操作多种数据类型的目的。
泛型将方法实现行为与方法操作的数据类型分离,实现了代码重用。
(1) 类型参数:例如:在 List<T> 中,T就是类型参数。
根据泛型类型参数是否提供实际类型,泛型分为两类:未绑定的泛型和已构造的泛型。
开放类型和密封类型。
开放类型是指包含类型参数的泛型,所有未绑定的泛型都属于开放类型;而封闭类型则是指那些已经为每一个类型参数都传递了实际数据类型的泛型。
实现泛型类的时候,我们使用了where T:IComparable的代码,其中where语句用来使类型参数继承于IComparable接口,从而对类型参数进行约束。
(2) 泛型中的静态字段和静态函数问题:
每个封闭的泛型类型中都有属于它自己的静态字段。
(3) 类型参数的推断:增强代码的可读性。
// 泛型方法
private static void genericMethod<T>(ref T t1, ref T t2)
{
T temp = t1;
t1 = t2;
t2 = temp;
}
C12 可空类型、匿名方法和迭代器:
(1)Nullable<T>和Nullable :
空合并操作符,即??操作符,它会对左右两个操作数进行判断:如果左边的数不为null,就返回左边的数;如果左边的数为null,就返回右边的数。
注:??运算符不能应用于值类型。(除了可空类型外,其他的值类型都是不能与null类型进行比较的。)
可空类型的装箱和拆箱:当把一个可空类型付给引用类型变量是,CLR会对可空类型(Nullable<T>)对象进行装箱处理;当把一个已装箱的值类型付给可空类型变量时,CLR会对已装箱的值类型进行拆箱处理。
(2)匿名方法:没有名字的方法。
回顾委托的使用方法:
代码:12.2.1_1
class Program
{
// 定义投票委托
delegate void VoteDelegate(string name);
static void Main(string[] args)
{
// 使用Vote方法来实例化委托对象
//VoteDelegate votedelegate = new VoteDelegate(new Friend().Vote);
// 下面方式为隐式实例化委托对象方式,把方法直接赋给委托对象
VoteDelegate votedelegate = new Friend().Vote;
// 通过调用托来回调Vote()方法,此为隐式调用方式
votedelegate("SomeBody");
Console.Read();
}
public class Friend
{
// 朋友的投票方法
public void Vote(string nickname)
{
Console.WriteLine("昵称为:{0} 来帮Learning Hard投票了", nickname);
}
}
}
委托是用来包装方法的类类型,既然匿名方法也是方法,当然可以被委托类型包装了,所以我们还可以用匿名方法的方式去实现上面的代码:
代码:12.2.1_2
// 匿名方法的使用演示
class Program
{
// 定义投票委托
delegate void VoteDelegate(string name);
static void Main(string[] args)
{
// 使用匿名方法来实例化委托对象
VoteDelegate votedelegate = delegate(string nickname)
{
Console.WriteLine("昵称为:{0} 来帮Learning Hard投票了", nickname);
};
// 通过调用托来回调Vote()方法,此为隐式调用方式
votedelegate("SomeBody");
Console.Read();
}
}
匿名方法的缺点:不能再其他地方被调用,即不具有复用性。
闭包:指的是在匿名方法中捕捉(即引用)了外部变量。两个概念:外部变量和被捕捉的外部变量。
代码:12.2.2
class Program
{
// 定义闭包委托
delegate void ClosureDelegate();
static void Main(string[] args)
{
// 调用方法
closureMethod();
Console.Read();
}
// 闭包方法
private static void closureMethod()
{
// outVariable和capturedV