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爆炸的尴尬局面

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容

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