你用过这种奇葩的C#注释吗?如何看待
本人虽然不是专业开发人员,也非专业出身,但一直使用C#堆码,解决自己日常的小问题。包括自己的研究,也是用C#来实现和测试。对C#是情有独钟。虽然C#的很多高级技术不会用,也不太懂,但总归是知道,耳闻目染,都多多少少了解一点。因为研究开源组件和技术比较多的原因,经常翻别人的代码(大部分是国外的),免不了要翻译,所以我也是经常翻译和总结,例如我前2个翻译的一些机器学习的文章:
【原创】.NET平台机器学习组件-Infer.NET连载(一)介绍
【原创】.NET平台机器学习组件-Infer.NET连载(二)贝叶斯分类器
其实翻译一直在进行,也完成很多了,但还没有时间整理和发表上来给大家分享。但是前不久在看代码(也是翻译的一部分)过程中,发现了一个非常奇葩的注释,所以顺手就搜索引擎翻了翻,总结一下,同时大家也谈谈如何看待这种写法。
由于对代码的注释很多人都有不同见解,包括前段时间,博客园新闻里面有篇文章,大概意思是说有注释,说明本身代码就很烂,所以用注释来补充。当然我并不认同这种观点,虽然也有一点点道理。
声明:有可能本人见识比较少,可能很多人见过,也用过,我第一次见到,反正有点震惊,当然肯定是符合语法要求的,所以写出来,请轻拍。
1.C#的注释方式
搞C#的人应该都清楚,C#有3种标识注释的方式:
1.1 三斜杠(///)方式
一般用于类或者方法的前面,如下面的代码:
/// <summary>
/// 这里是注释。。。。。
/// Latent Dirichlet Allocation (LDA) model implemented in Infer.NET.
/// This version scales with number of documents.
/// </summary>
1.2 双斜杠(//)方式
一般是对临时变量,属性等的注释,当然也可以用在类或者方法前面,反正都是注释,如下面的代码:
//---------------------------------------------
// The model
Range D = new Range(NumDocuments).Named("D");
3.块注释(/*XXXX*/)方式
一般用于一段连续的注释代码块,如下面的代码:
/* 这段程序已经不再有用
* 因为我们发现千年虫问题只是一场虚惊
* 我们的系统不会恢复到1/1/1900
*/
我印象中,C#的注释的标识符应该就是这3种把,当然其他的一些注释类型参数,我们不讨论。
2.这样注释奇葩么?
上面三种注释方式大家肯定都用过,估计也是和我一样(大部分),写在类,属性或者临时变量前面,另起一行。
我这里说的奇葩,并不是脱离三种方式,而是其注释的位置,但是在浏览一段开源的代码的时候,发现了这个注释,当时吃惊,然后是思考,先看看:

上面一段代码包括了前面提到的3种注释方式,红色框里面的就是我说的 奇葩注释,用的是 /* */块方式,写在数组定义的中间,毫无疑问,这肯定是可以运行的。只是以前没想到可以这样,可能局限于自己的思维方式。
根据我的理解,开发人员这样注释的目的,由于这段代码的变量包含的信息量很大,这样写更加直接明了。但是否多余,也可以直接在变量上面进行说明?
反过来想一想,在一些很复杂的问题中,变量的初始化可能非常复杂,这里的数组长度是2,如果是20,那怎么办?这样写优势就出来了,可以使得看代码的人,一目了然。
又在一个地方发现了一段类似注释的代码,是这样的:

3.对自己好用,那就用起来
刚开始有点接受不了,为了这个事情,我回忆了自己很多写过的代码,还特意翻了翻,最终我觉得以后在自己的代码中也可以逐步在合适的地方采用这种方式,一方面是由于以前没想到可以这样用,思维局限在哪里,习惯另起一行说明;另一方面的确是有很多代码需要这样明了的注释,可能自己的代码和架构能力不够,在很多地方耦合很严重,不得不通过很多的注释来表现自己的想法,而变量有特别多,像这种初始化的情况,的确是很很说明,看看我修改后的一段代码例子:
3.1 以前注释方式
以前的一段代码中,有一个固定的有限列表,是公司编号,但实际开发的时候,经常要知道对应的名称,当然数据库里面可以去查找,但代码里面直接看不到,所以我这样写的:
//权威公司编号名称(顺序):"澳门","金宝博","立博","威廉希尔","伟德","10BET","bet 365","SNAI"
static List<Int32> AuthCompanyIdList = new List<int>(){ , , , , , , , };
所以以前每次打开的时候,有错误或者手动排查一些信息,对着编号去注释找,虽然次数很少,但偶尔也要用到。所以看到上面的注释方式后,修改了一下。
3.2 现在的注释方式
修改后的代码是这样的,不是特意去改,是这样改之后,我自己也觉得好多了,看到这个代码就知道意思了。
internal static List<Int32> AuthCompanyIdList = new List<int>(){
/*澳门*/, /*金宝博*/,
/*立博*/, /*威廉希尔*/, /*伟德*/, /*10BET*/,
/*bet 365*/, /*SNAI*/
};
其实哪种都可以,重要的是你看得懂,方便看,所以如果你觉得有用,可以用上,觉得纯属无聊,那就跳过吐槽一下。
4.最后猜猜谁写的
敲代码应该是件轻松的事情,如果能把代码写得非常优雅,好懂,当然最好不过了。最后娱乐一下,猜猜这代码来自哪里?
A:某商业机器学习算法软件的.NET例子;
B:某国外开源机器学习算法的.NET实现博客例子;
C:微软研究人员机器学习算法实现的例子;
D:Python开源社区一个机器学习算法py实现的.NET版本;
如何看待和这种注释,各抒其见把。。。。也可能是我小题大作了把。。。了解,不断改进细节,不断进步把。。
下午揭晓答案。。。。
第一段代码来自微软剑桥研究院,是Infer.NET的一个Demo代码
第二段代码来自开源机器学习组件Accord.NET Framework的实例代码
你用过这种奇葩的C#注释吗?如何看待的更多相关文章
- 你用过这种奇葩的C#注释吗
博客园一位微软MVP的文章 http://www.cnblogs.com/asxinyu/p/4383402.html#autoid-0-0-0 摘录: 我这里说的奇葩,并不是脱离三种方式,而是其注释 ...
- .NET平台机器学习资源汇总,有你想要的么?
接触机器学习1年多了,由于只会用C#堆代码,所以只关注.NET平台的资源,一边积累,一边收集,一边学习,所以在本站第101篇博客到来之际,分享给大家.部分用过的 ,会有稍微详细点的说明,其他没用过的, ...
- .NET平台机器学习
.NET平台机器学习资源汇总,有你想要的么? 接触机器学习1年多了,由于只会用C#堆代码,所以只关注.NET平台的资源,一边积累,一边收集,一边学习,所以在本站第101篇博客到来之际,分享给大家.部分 ...
- .NET平台机器学习资源汇总,有你想要的么?(转)
出处:http://www.cnblogs.com/asxinyu/p/4422050.html 阅读目录 1.开源综合类 2.开源.NET平台非综合类 3.其他资源与技术博客 4.我的100篇博客之 ...
- java web开发中的奇葩事web.xml中context-param中的注释
同事提交了代码.结果除同事之外,其他人全部编译报错.报错说web.xml中配置的一个bean 没有定义.按照报错提示,各种找,无果. 由于代码全部都是提交到svn主干,之前也没有做过备份,只能一步一步 ...
- 记一次使用 android 自带 WebView 做富文本编辑器之API、机型的兼容及各种奇葩bug的解决
转载请声明出处(http://www.cnblogs.com/linguanh/) 目录 1,测试设备介绍 2,开源项目richeditor及CrossWalk的选择 3,遇到的bug及其解决方法 4 ...
- GPS围栏两个多边形相交问题的奇葩解法
前言 GPS测量仪测量的产地面积,然后提交到系统中,系统需要校验这块产地和其他产地是否有重叠,重叠超过10%就要提出警告这块产地已经被XXX登记入库了.GPS测量仪测量出来的数据是连续的经纬度坐标数据 ...
- jQ1.5源码注释以及解读RE
jQ作为javascript的库( ▼-▼ ), 尽善尽美, 代码优美, 值得学习. 这一周平常上班没啥事也看jQ1.5的代码, 今天周六差不多看完了(Sizzle部分还没看), 重新看了一下, ...
- mybatis generator 生成中文注释
mybatis generator默认生成 的注释太奇葩了,完全不能拿到生产去用,不过幸亏提供了接口可以自己扩展.长话短说,要生成如下的domain, package com.demo.domain; ...
随机推荐
- Select loop
The Bash Shell also offer select Loop, the syntax is: select varName in list do command1 command2 .. ...
- iOS开发零基础--Swift篇 循环
循环的介绍 在开发中经常会需要循环 常见的循环有:for/while/do while. 这里我们只介绍for/while,因为for/while最常见 for循环的写法 最常规写法 // 传统写法 ...
- 项目文件""已被重命名或已不在解决方案中
如题,这个错误在vs2010里,开始编译的时候出现了,我的解决办法就是把所有的project都移除,然后再添加进来,就不弹这个错误了.
- 编译系统中的 NFA/DFA算法理解
1.问题概述 NFA 和 DFA浅析---要深入了解正则表达式,必须首先理解有穷自动机. 有穷自动机(Finite Automate)是用来模拟实物系统的数学模型,它包括如下五个部分: 有穷状态集St ...
- JS正则表达式验证数字
<script type="text/javascript"> function validate(){ var reg = new RegExp("^[0- ...
- FastCgi 与 PHP-FPM
- 如果现在请求的是 /index.php,根据配置文件,nginx 知道这个不.是静态文件,需要去找 PHP 解析器来处理,那么他会把这个请求简单处理后交给 PHP 解析器.Nginx 会传哪些数据 ...
- 【String与基本类型之间的转换】以及【进制转换】
1. 基本数据类型---->字符串类型: 方法一:使用连接一个空字符串,例如 基本数据类型+“” : 方法二:静态方法 String.valueOf(),具体有: String.valueOf ...
- [leetcode 34] search for a range
1 题目: Given a sorted array of integers, find the starting and ending position of a given target valu ...
- nginx(4、缓存)
nginx提供内置的缓存功能,对静态文件,如html\css\js等能够缓存在本地,即nginx服务器的某个目录下. 其配置主要是两部分: 1.在http下配置一个缓存路径: proxy_cache_ ...
- Linux date命令
命令概述 date命令可以用来设置和显示系统当前时间,特别是在有一些Shell命令里面用到date命令来做日期的不同的显示,所以该命令也是非常需要掌握的一个命令. 语法 date [OPTION].. ...