C#历代语法糖"粗糙"介绍

写在最前面:一些我不喜欢的特性已经被神隐了

C# 1 :这个时代,跟古董Java没太大差别,略

C# 2

  1. 添加了空值类型
int? a = null;
  1. 添加泛型
class EmployeeList<T> where T : Employee, IEmployee, System.IComparable<T>, new() { // ... }
  1. 添加 yield return,可以比较方便的写一个iterator了.
public IEnumerator GetEnumerator() 
{ 
    yield return -1;
    for (int i = 1; i < max; i++) 
    {
         yield return i; 
    }
}
  1. 可以用匿名方法(Anonymous Method)去创建委托了...虽然还是不那么优雅.
  2. 委托的逆变和协变.协变针对委托的返回值,逆变针对参数.
  3. 静态类.static class 静态类,可以约束里面所有成员都是静态的.
  4. Friend Assembly 让其他程序集可以访问internal类型...
  5. fixed 固定长度的数组,不过数组必须是bool, byte, char, short, int, long, sbyte, ushort, uint, ulong, float, double中的一种
  6. extern alias程序集别名,可以用来引入同一个程序集不同版本
  7. volatile ,可以用来让编译器不对值进行单线程下的优化,保证线程安全.

C# 3

  1. var 关键字,可以进行类型推断,不过类型还是静态类型...
  2. 扩展方法 注意,扩展方法的优先级,低于常规方法,滥用的话,可能导致后面程序无法升级
    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)
        {
            /**/
        }
    }
  1. lambda 表达式.进一步对匿名方法进行简化,而且可以与表达式树转化.
  2. 对象和集合初始化语法简化.
  3. 匿名类型 可以创建这样的东西,可以少写一些没意义的DTO,但是请权衡是否应该使用.
    var aMan = new {
        Name = "alec",
        Age = 24
    };
  1. 自动属性 这个特性会让新手误导,忘记属性的本质是方法,还有隐藏字段,不过没关系.
  2. linq 整个C#3 的所有特性,简直就是为了linq而生,这里就不展开讲了.
  3. expression tree

C#4

  1. 对泛型接口的协变与逆变
    IList<string> strings = new List<string>();

    IList<object> objects = strings;
  1. dynamic 动态绑定(听说你们喜欢弱类型?)
    class BaseClass
    {
        public void print()
        {
            Console.WriteLine();
        }
    }

    Object o = new BaseClass();
    dynamic a = o;
    //这里的缺点在于编译的时候无法检查方法的合法性,写错的话就会出运行时错误。
    Console.WriteLine(typeof(a));
    a.print();
  1. 可选参数,命名参数(可以不用跟傻逼Java一样的没完没了的重载了).
    private void CreateNewStudent(string name, int studentid = 0, int year = 1){}

    CreateNewStudent(year:2, name:"Hima", studentid: 4); //没有按照方法定义的参数顺序

C#5

  1. 可以在lambda中,使用循环变量了.
    而不会出现那种js常见的闭包问题.

  2. 方法调用信息,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");
    }
  1. 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

  1. ?.
  2. nameOf
  3. $"stringFormat简化啦{expression}"
    其他的,没印象了,毕竟一直用VS2013...

C# 7

还没用上,需要VS2017(目前还是RC版,怕boom),十分期待新特性匿名元祖.可以缓解目前DTO爆炸的尴尬局面

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,833评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,452评论 18 399
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 9,463评论 1 10
  • 定义 语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter ...
    丶PanPan阅读 11,196评论 5 20
  • 临近过年的日子,是个回顾的好机会。正好前一段看到这篇翻译介绍 读自己以前代码的Kata,拿来练习练习。其实Thom...
    武可阅读 4,619评论 0 5

友情链接更多精彩内容