C# 2.0

序言

泛型

为什么需要泛型?

 

分部类型

分部类和方法

partial

匿名方法

 

使用Delegate的时候很多时候没必要使用一个普通的方法,因为这个方法只有这个Delegate会用,并且只用一次,这时候使用匿名方法最合适。

 

delegate 运算符创建一个可以转换为委托类型的匿名方法:

Func<int, int, int> sum = delegate (int a, int b) { return a + b; };
Console.WriteLine(sum(3, 4));  // output: 7

从 C# 3 开始,lambda 表达式提供了一种更简洁和富有表现力的方式来创建匿名函数。 使用 => 运算符构造 lambda 表达式:

Func<int, int, int> sum = (a, b) => a + b;
Console.WriteLine(sum(3, 4));  // output: 7

使用 delegate 运算符时,可以省略参数列表。 如果这样做,可以将创建的匿名方法转换为具有任何参数列表的委托类型,如以下示例所示:

Action greet = delegate { Console.WriteLine("Hello!"); };
greet();

Action<int, double> introduce = delegate { Console.WriteLine("This is world!"); };
introduce(42, 2.7);

// Output:
// Hello!
// This is world!

可以为null的值类型

引用类型可以为空,但是值类型不能为空。在一些的情况下,这可能就是一个坑,比方说当数据库或者XML的数据映射到C#类型上时,因为数据库和XML在int和double等值类型(C#)可以为null,但是C#类型不能为null。

C#有一个解决方案:可以为空的值类型

int x1 = 1;
int? x2 = null;

正常的值类型可以赋值给可以为空的值类行,但是反过来不行,需要强制类型转换

x2=x1;//这是可行的
x1=x2;//这不可行
x1=(int)x2;//这将可行

如果在赋值的时候不知道该值是否为空,这可以使用HasValue来判断是否为空,如果为空则true,否则为false

int x3 = x2.HasValue ? x2.Value : -1;

如果操作的是 可为空的值类型,则可以简写语法。如果为空,这赋值-1,否者赋值x3的值。

int x6 = x3 ?? -1;

迭代器

  C#中的迭代器可以让你实现foreach访问某个集合中的所有元素。像数组、集合等已经内置了迭代器,我们可以直接进行foreach,而我们自定义的类型,自然是无法进行这个操作的,对于自定义的类型实现迭代器模式通过IEnumerable和IEnumerator接口(或泛型接口)进行实现。在C#1.0中我们自定义类型实现迭代器是非常繁琐的想要对IterationSample进行foreach,首先继承IEnumerable接口,会有一个GetEnumerator的方法需要去实现,这时创建另一个类实现IEnumerator接口,实现MoveNext方法与Current属性,我们需要进行位置的处理。

  这里在C#2.0中变的简单了,这时使用yield return就可以代替整个IterationSampleIterator这个类。

static void Main()
{
    foreach (int number in SomeNumbers())
    {
        Console.Write(number.ToString() + " ");
    }
    // Output: 3 5 8
    Console.ReadKey();
}

public static System.Collections.IEnumerable SomeNumbers()
{
    yield return 3;
    yield return 5;
    yield return 8;
}
View Code

协变和逆变

在 C# 中,协变和逆变能够实现数组类型、委托类型和泛型类型参数的隐式引用转换。 协变保留分配兼容性,逆变则与之相反。

 

除现有功能以外的其他 C# 2.0 功能:

getter/setter 单独可访问性

方法组转换(委托)

静态类

委托推断

资料

posted @ 2019-12-08 12:12  ~沐风  阅读(202)  评论(0编辑  收藏  举报