写在最前面:一些我不喜欢的特性已经被神隐了
C# 1 :这个时代,跟古董Java没太大差别,略
C# 2
- 添加了空值类型
int? a = null;
- 添加泛型
class EmployeeList<T> where T : Employee, IEmployee, System.IComparable<T>, new() { // ... }
- 添加 yield return,可以比较方便的写一个iterator了.
public IEnumerator GetEnumerator()
{
yield return -1;
for (int i = 1; i < max; i++)
{
yield return i;
}
}
- 可以用匿名方法(Anonymous Method)去创建委托了...虽然还是不那么优雅.
- 委托的逆变和协变.协变针对委托的返回值,逆变针对参数.
- 静态类.static class 静态类,可以约束里面所有成员都是静态的.
- Friend Assembly 让其他程序集可以访问internal类型...
- fixed 固定长度的数组,不过数组必须是bool, byte, char, short, int, long, sbyte, ushort, uint, ulong, float, double中的一种
- extern alias程序集别名,可以用来引入同一个程序集不同版本
- volatile ,可以用来让编译器不对值进行单线程下的优化,保证线程安全.
C# 3
- var 关键字,可以进行类型推断,不过类型还是静态类型...
- 扩展方法 注意,扩展方法的优先级,低于常规方法,滥用的话,可能导致后面程序无法升级
public static class JeffClass
{
public static int StrToInt32(this string s)
{
return Int32.Parse(s);
}
public static T[] SomeMethd<T>(this T[] source, int pram1, int pram2)
{
/**/
}
}
- lambda 表达式.进一步对匿名方法进行简化,而且可以与表达式树转化.
- 对象和集合初始化语法简化.
- 匿名类型 可以创建这样的东西,可以少写一些没意义的DTO,但是请权衡是否应该使用.
var aMan = new {
Name = "alec",
Age = 24
};
- 自动属性 这个特性会让新手误导,忘记属性的本质是方法,还有隐藏字段,不过没关系.
- linq 整个C#3 的所有特性,简直就是为了linq而生,这里就不展开讲了.
- expression tree
C#4
- 对泛型接口的协变与逆变
IList<string> strings = new List<string>();
IList<object> objects = strings;
- dynamic 动态绑定(听说你们喜欢弱类型?)
class BaseClass
{
public void print()
{
Console.WriteLine();
}
}
Object o = new BaseClass();
dynamic a = o;
//这里的缺点在于编译的时候无法检查方法的合法性,写错的话就会出运行时错误。
Console.WriteLine(typeof(a));
a.print();
- 可选参数,命名参数(可以不用跟傻逼Java一样的没完没了的重载了).
private void CreateNewStudent(string name, int studentid = 0, int year = 1){}
CreateNewStudent(year:2, name:"Hima", studentid: 4); //没有按照方法定义的参数顺序
C#5
可以在lambda中,使用循环变量了.
而不会出现那种js常见的闭包问题.方法调用信息,C#4 的可选参数基础上添加了一些标注,可以用来捕获一些特殊信息
public static void Trace(string message,
[CallerFilePath] string sourceFile = "", [CallerMemberName] string memberName = "") {
string msg = String.Format("{0}: {1}.{2}: {3}",
DateTime.Now.ToString("yyyy-mm-dd HH:MM:ss.fff"),
Path.GetFileNameWithoutExtension(sourceFile),
memberName,
message);
LoggingInfrastructure.Log(msg);
}
// In file Validation.cs
public void ValidateDatabase() {
Log.Trace("Entering method");
// compiles to Log.Trace("Entering method", "Validation.cs", "ValidateDatabase")
Log.Trace("Exiting method");
}
- async 与 await 关键字.
可以让整个代码管线unblock
主要工作逻辑,当程序遭遇 await 关键字,会像yeild return 一样保存当前上下文,然后直接跳转这个方法行末,并注册一个回调方法到回调队列中.
等待回调方法唤醒这个上下文(注意,这里可能是另外的线程,但是是同一个"上下文").
继续执行.虽然我用的多,但是我讲不明白..还是看一个代码案例吧.
public async Task FuckAsync()
{
using (var httpclient = new HttpClient())
{
var keyword = "我的天呐";
var responseMessage = await httpclient.GetAsync(string.Format("https://www.baidu.com/s?wd={0}", keyword));
var result = await responseMessage.Content.ReadAsStringAsync();
Console.WriteLine(result);
}
}
在各种IO操作,都可以unblock主线程了....
根据微软目前提供的集中操作,Unblock方法,要以Async 结尾.
并且有传入一个CancellationToken用以取消异步操作的重载.
具体异步相关知识,请看我异步与Rx系列的文章
C# 6
- ?.
- nameOf
- $"stringFormat简化啦{expression}"
其他的,没印象了,毕竟一直用VS2013...
C# 7
还没用上,需要VS2017(目前还是RC版,怕boom),十分期待新特性匿名元祖.可以缓解目前DTO爆炸的尴尬局面