缘由

对于初次接触某个第三方库的C#开发者,假如要调用里面一个方法,发现需要一个A类型的实例作为参数,怎么获得这个实例呢?

我想大多数人会先尝试new A吧:

如果没有,可能会尝试输入A.看看有没可能的构造方法:

 要 如果还没有,那一般要通过其他方式获得了(子类、其他方法的返回结果等)。就此打住,因为后面的不在此文讨论范围。

我就郁闷了,为何要我输入一次new之后发现没有,然后再次输入A.呢?

我指的是,最好让C#编译器支持这样的语法糖:A.new() 跟new A()等价。

本文不适合的阅读对象

  • 文档帝:万事必先看文档的人,本文说明的东西与你无关。

  • 键盘帝:不使用VS或者类似的智能提示的用户,本文说明的东西对你没什么影响。

好处是什么?

“你不觉得输入一次new A之后删掉再输入A.这个过程很傻吗?”

只需输入A.即可知道是否有构造函数,类似A.create这样的工厂方法,或者像A.instance这样的单例对象,列在一起更方便对比。

另外一个好处是,A.new 可以通过匹配参数类型来赋值给一个委托实例(Delegate)。

有什么可能出现的问题?

  • “万一用户想创建一个名为new的方法怎么办?”

毫无疑问,这种方式可能引起误解,以为这是一个静态方法,相当于类空间的命名被污染了。不过这种的说法是不成立的。

首先,假设A是个类型,当看到A.x()的时候,你觉得这是什么?事实上,你完全不能确定他是啥,可能是一个静态方法,也可能是静态属性,还可能是静态字段。所以,A.new()到底是什么本身就没可误解的地方。

其次,当用户想定义一个名为new的方法,实际上也是不可行的:

因为new是个关键字,要作为方法名的话,前面需要加@

调用时@也是不可省略的

所以,A.new()本来就是不能编译通过的,跟现有语法体系没有冲突。

对比起来,C#的自动属性才是真正的“污染类空间命名”,而附加属性也一定程度影响开发者的惯性思维,A.new()比起这些真的是小巫见大巫,语法糖而已。

  • “反射的时候,会有问题吗?”

我觉得不会,Type.GetMethod的时候,本来就不包含构造函数。抽象类、接口、枚举这些东西,有new没new本身就是规则定好的,跟现有语法不混淆。

至于各种IDE的智能提示,作为规则支持就是了。

  • “假如A的名字好长好长,就没new A()方便”

是的,当输入B.f(new空格后,可以看到A在列表里直接选择回车,这样敲的字符数是很少的。所以,new A()的方式完全可以保留。另外,提供一个智能提示,还记得事件绑定的那个snippet吗?

待补充

到此,我还是没想到把A.new()编译成new A()有什么坏处,关于这个建议如果各位有其他想法,不妨留个言?

C#如果把A.new()编译成new A()的更多相关文章

  1. 【CLR via C#】CSC将源代码编译成托管模块

    下图展示了编译源代码文件的过程.如图所示,可用支持 CLR 的任何一种语言创建源代码文件.然后,用一个对应的编译器检查语法和分析源代码.无论选用哪一个编译器,结果都是一个托管模块(managedmod ...

  2. C代码编译成可执行程序的过程

    C代码通过编译器编译成可执行代码,经历了四个阶段,依次为:预处理.编译.汇编.链接. 接下来详细讲解各个阶段 一.预处理 1.任务:进行宏定义展开.头文件展开.条件编译,不检查语法. 2.命令:gcc ...

  3. 转 Flex MXML编译成AS类

    2009-09-22 23:25 Flex MXML编译成AS类 由“Flex 基础”文中可知:每一个mxml文件首先要编译成as文件,然后再译成swf文件.app.mxml文件编译后会产生一系列中间 ...

  4. 将STM32的标准库编译成lib使用【图文】

    以前一直使用STM32的标准库,需要一步步地将代码加进去,将编译选项设置好,然后再编译整个工程. 这个编译过程是一个相当慢的过程!完全编译大约需要一支烟的时间.每次建立工程都这么编译,是一个相当浪费时 ...

  5. 使用 DJ Java Decompiler 将整个jar包反编译成源文件

    使用 DJ Java Decompiler 将整个jar包反编译成源文件 所使用的软件是 DJ Java Decompiler 3.9. 下面是一个有用的参考文档,说明如何批量编译 http://ww ...

  6. 把C编译成javascript的方法

    把C编译成javascript的方法,便于嵌入到HTML5中 https://github.com/kripken/emscripten

  7. 将STM32的标准库编译成lib

    转载自:http://www.cnblogs.com/zyqgold/p/3189719.html 以前一直使用STM32的标准库,需要一步步地将代码加进去,将编译选项设置好,然后再编译整个工程. 这 ...

  8. 使用Maven将Hadoop2.2.0源码编译成Eclipse项目

    编译环境: OS:RHEL 6.3 x64 Maven:3.2.1 Eclipse:Juno SR2 Linux x64 libprotoc:2.5.0 JDK:1.7.0_51 x64 步骤: 1. ...

  9. PHP如何大幅度提升运行效率? -- 把它编译成机器码!

      书接上回   今天讨论如何大幅度提升PHP的运行效率. 在这,我们不纠结神马单双引号.全局变量.OO.require_once.错误抑制.... 在这,我们也不讨论APC.opcache.XCac ...

随机推荐

  1. 07-阻塞赋值与非阻塞赋值原理分析——小梅哥FPGA设计思想与验证方法视频教程配套文档

    芯航线--普利斯队长精心奉献   实验目的:掌握阻塞赋值与非阻塞赋值的区别 实验平台:无 实验原理:     阻塞赋值,操作符为"=","阻塞"是指在进程语句( ...

  2. Linux时间戳和标准时间的互转

      转http://hi.baidu.com/taolizao/blog/item/2d6f9a1ba50ef3eae0fe0ba9.html 在LINUX系统中,有许多场合都使用时间戳的方式表示时间 ...

  3. jquery常用插件及用法总结

    http://www.jb51.net/Special/200.htm

  4. 教你如何查看一款App里面所包含的图片

    在开发制作App的过程中,有时候会想看看一些精美的App里面所设计的素材.这个时候就需要用到我给大家展现的方法了.下面就看看该如何操作能让一个App呈现出它原始的一面,这次我以Any.Do为例给大家演 ...

  5. this的用法

    因为循环是非常快的,我们手动点击的时候,for循环已经循环完了.如果在循环里面添加点击事件,点击事件的i的值就是循环结果的那个值,而不是对应的循环的值,此时,我们就需要用到this   来实现  点击 ...

  6. 我为开源做贡献,网页正文提取——Html2Article

    为什么要做正文提取 一般做舆情分析,都会涉及到网页正文内容提取.对于分析而言,有价值的信息是正文部分,大多数情况下,为了便于分析,需要将网页中和正文不相干的部分给剔除.可以说正文提取的好坏,直接影响了 ...

  7. 让PictureBox支持URL显示图片

    [ToolboxItem(true)] public class PictureBoxURL : PictureBox { private string _url = ""; pu ...

  8. srand()以及rand()函数用法

    srand()就是给rand()提供种子seed 如果srand每次输入的数值是一样的,那么每次运行产生的随机数也是一样的, srand(n) for(10) rand()也就是说,以一个固定的数值作 ...

  9. Codeigniter文件上传类型不匹配错误

    Codeigniter的文件上传类方便了我们使用PHP来处理文件上传的操作,使用起来非常简单,如下:   $config['upload_path'] = './uploads/'; $config[ ...

  10. 微信小程序-发起请求

    wx.request(object) wx.request发起的是https请求.一个微信小程序,同时只能有5个网络请求连接. object参数说明: 示例代码: wx.request({ url: ...