本文来告诉大家在C#很少有人会发现的科技。即使是工作了好多年的老司机也不一定会知道这些科技,如果觉得我是在骗你,那么请看看本文的内容。
原本最初C#的设计是简单和高效开发的,在经过了这么多年众多公司和开发者的努力下,整个C#里面包含了大量有趣的功能。其中一部分功能是针对于某些特殊需求设计的,例如高性能或高并发或无内存回收等。在经过了10多年的迭代,很少人能完全了解整个C#语言和框架级做了哪些有趣的功能
我在网上找了很多大神的博客,然后和很多大神聊天,知道了一些科技,于是就在本文和大家分享一下。如果大家有了解本博客里面没有收藏的科技,还请告诉我
现在整个C#从编译器到运行时都是开源的,所有权在dotnet基金会上,全部开源的项目都基于最友好的MIT协议和Apache2开源协议,文档协议遵循CC-BY协议。这将允许任何人任何组织和企业任意处置,包括使用,复制,修改,合并,发表,分发,再授权,或者销售。唯一的限制是,软件中必须包含上述版权和许可提示,后者协议将会除了为用户提供版权许可之外,还有专利许可,并且授权是免费,无排他性的(任何个人和企业都能获得授权)并且永久不可撤销,用户使用.NET和C#完全不用担心收费问题和版权问题,以及后续无法维护问题。而dotnet基金会是一个开放的平台,我也是dotnet基金会的成员之一。微软在的时候依然是dotnet基金会最大的支持组织
现在最火的dotnet仓库是dotnetcsharplang仓库,当前的C#语言特性由整个社区决定,这是一个官方开放用来讨论C#语言未来的仓库,天天都有大佬们在讨论语言的特性,欢迎大家加入
接下来让我告诉大家一些很少有人会发现的科技
无限级判断空在C#6.0可以使用??判断空,那么就可以使用下面代码
varv1="";stringv2=null;stringv3=null;varv=v1??v2??v3;
实际上可以无限的使用??判断前面一个函数为空,那么问题来了,下面的代码输出的是多少?
varn=2+foo?.N??1;
上面代码的foo就是空的,那么n是多少?是1还是2还是3还是空?
想要了解这道题的推导过程请看C#高级面试题里面写了很多老司机都不一定能解出
使用using关键词省略长的定义例如有下面这个代码,在这个代码里面使用了很多的List嵌套,如下面代码所示里面有很多定义的代码
varfoo=newSystem.Collections.Generic.DictionarySystem.Collections.Generic.ListSystem.Collections.Generic.Liststring,string();
可以看到上面代码中,有大量的代码都是用来作为类型的定义,假设这个值作为某个方法的参数,那才是可怕
一个简单的方法是使用using关键词,如在文件的开头添加如下代码
usingHvcnrclHnlfk=System.Collections.Generic.DictionarySystem.Collections.Generic.ListSystem.Collections.Generic.Liststring,string;
在添加了上面代码之后,在这个文件里的所有用到如上面很长的定义的代码都可以使用using后面的值可以代替,如本文上面使用了HvcnrclHnlfk这个词,来看看替换之后的代码长度
varfoo=newHvcnrclHnlfk();辣么大
实际上写到这里我有些不好意思,好像刚刚说的都是大家都知道的,那么我就要开始写大家很少知道的科技
等等,什么是辣么大大哇?其实这是lambda表达式的翻译
请看看下面这段有趣的代码
Funcstring,string,EventHandlerfoo=(x,y)=(s,e)={varbutton=(Button)s;button.Left=x;button.Top=y;};Button1.Click+=foo(0,-1);
上面的代码通过一个lambda表达式返回一个另一个lambda表达式,或者说用一个委托返回另一个委托。这是一个特别有趣的写法,通过函数返回函数的思想可以用来写出一些有趣的逻辑,特别是在多层嵌套的时候
当然使用委托可是会出现另一个问题的,请问下面的代码实际调用的是哪个委托,下面代码的a和b和c都是Action委托,同时都不是空的
((a+b+c)-(a+c))();
在数学上,其实函数也可以视为变量,很有科技范的C#当然也支持如此的功能,将函数包装为委托的时候,可以让委托本身支持加减法哦,只是这个加减法的规则有些诡异。不信,请猜猜上面代码执行了什么函数
冲突的类型在遇到某些类型,特别是放在NuGet上的多个不同的库里面的类型,这些类型有相同的类名,如Data或Control等很通用的命名的时候,在代码中如果需要同时使用这两个类,就需要补全整个命名空间,如下面代码
varwebControl=newSystem.Web.UI.WebControls.Control();varformControl=newSystem.Windows.Forms.Control();
如果经常使用这两个控件,那么就需要写很多补全命名空间的代码,代码很多。好在微软的大佬们给出了一个坑方法,使用这个方法可以不写命名空间,或者说只需要在文件开始using一次,请看代码
usingweb=System.Web.UI.WebControls;usingwin=System.Windows.Forms;web::ControlwebControl=newweb::Control();win::ControlformControl=newwin::Control();
参见: