Posts Tagged “summary”

想当年学C#的时候.Net还是2.0,学了就直接丢掉了,要不是到MS来实习,估计也未必会再捡起来了,结果.Net都4.0了。最近coding才发现C# 3.0多了好多新特性,而自己还把一些C# 2.0的特性彻底忘了,真不敢说自己会C#了。于是总结一下最近遇到并且常用到的特性吧。

1. ? – Nullable<T>

[SerializableAttribute]
public struct Nullable<T> where T : struct, new()

C#里像int, bool, double这样的struct和enum类型都不能为null。如果确实想在值域上加上null的话,Nullable就派上用场了。T?是Nullable&ly;T>的语法糖。要将T?转为T可以通过类型转换,或者通过T?的Value属性,当然后者要高雅些。

// Nullable<int> arg = -1;
int? arg = -1;
if (arg.HasValue) {
    // int value = (int)arg;
    int value = arg.Value;
}

2. ?? – operator ??

o ?? v可以看作是o == null ? v : o的语法糖。??运算符在左操作数非null时返回左操作数,否则返回右操作数。

string result = gao();
Console.WriteLine(result ?? "<NULL>");

3. => – lambda expression

看别人代码的过程中才发现原来C#也有lambda了,也才发现自己真的out了。当然,感觉C#里的lambda并没有带来什么革命性的变化,更像是一个语法糖。毕竟这不是Scale,MS也有F#了。

Func<double, double, double> hypot = (x, y) => Math.Sqrt(x * x + y * y);
Func<double, double, string> gao = (x, y) =>
    {
        double z = hypot(x, y);
        return String.Format("{0} ^ 2 + {1} ^ 2 = {2} ^ 2", x, y, z);
    };
Console.WriteLine(gao(3, 4));

4. {} – initializer

collection initializer使得初始化一个List, Dictionary变得简单。

List<string> list = new List<string>{"watashi", "rejudge"};
Dictionary<string, string> dic = new Dictionary<string, string>
{
    {"watashi", "watashi wa watashi"},
    {"rejudge", "-rejudge -pia2dea4"}
};

而object initializer其实就是调用完成构造后执行属性操作的语法糖,它使得代码更加简洁,段落有致。试比较:

Comments 11 Comments »