c#发展

首页 » 常识 » 问答 » C很少人知道的科技
TUhjnbcbe - 2020/11/24 15:53:00
北京那个医院看白癜风 http://baidianfeng.39.net/bdfby/yqyy/

本文来告诉大家在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();

参见:

1
查看完整版本: C很少人知道的科技