你们使用扩展方法么?

boss_george 2014-10-30 06:03:23
因为要给6个已经写好的类共同添加方法,为了日后统一维护也好,偷懒也好,耍帅也好,我单独弄了个类,里面使用扩展方法的写法,给所有需要加方法的类增加了扩展方法,领导的反应是:你就爱用怪异的写法。

问问,代码之美?怪异写法?你们如何认为的?
...全文
430 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
smthgdin_020 2014-11-02
  • 打赏
  • 举报
回复
你用switch...case, 如果这段代码刚好是变化的代码,这么写显然违反设计原则。
smthgdin_020 2014-11-02
  • 打赏
  • 举报
回复
引用 22 楼 boss_george 的回复:
[quote=引用 18 楼 smthgdin 的回复:] 1.扩展方法的主要使用场景不是你这样的; 2.扩展方法有一定污染性; 3.扩展方法没法使用被扩展类私有成员; 4.其实你可以听下领导的看法(当然,有时候你领导技术不行的话会比较失望)。
感谢你的回复 但是呢,并不认可你所有回复 1,2,你这毫无说服力,如果可能,详细描述一下? 3.此处并不需要访问私有的,我做的设计,尽量都使用公开的属性。 4.我已经按照领导的做法修改了程序了。 a.不使用扩展方法,并很2的把生成的xml片段使用重写ToString的方式返回 b.不使用xml序列化方法,而且不使用XmlDocument,而是自己拼接几行类似xml的标签行 c.因为自创格式,所以无法用XmlDocument读取,只好自己用正则分析取回的数据 d.原本统一的一个处理,完全可以自描述的格式,现在已经拆开,需要一堆的switch...case了,Oh,yeah,我以前自认为是设计师,经过这个领导的“洗礼”,我终于知道“码农”和“设计师”之间思想的鸿沟以及“码农”为什么被称之为“码农”了,我惊人的发现,这样垃圾的写法,其实代码行增加了至少10倍,如果按代码行算工资,我已经可以比以前多拿很多奖金了,原来按代码行算收入是这类人!懂了![/quote] 一般来说,在不能使用继承或者不能改写源码的情况下,才建议使用扩展方法。滥用扩展方法会给项目的扩展性,维护性和版本控制等方面造成不利影响。主要影响如下: 扩展方法本身不能访问被扩展类的私有成员; 扩展方法优先级低,所以会被被扩展类的同名方法覆盖; 扩展方法不会被派生类继承,也不能重写; 扩展方法有就近原则。如果在你的程序里有两个一模一样的扩展方法,和使用类处于同一命名空间里的扩展方法会被调用。 具体的话,你要分析你的场景是否适合,是否会引起一些弊端。因为我们不清楚你的具体需求和代码。
beyondcj 2014-11-01
  • 打赏
  • 举报
回复
boss_george 2014-10-31
  • 打赏
  • 举报
回复
引用 18 楼 smthgdin 的回复:
1.扩展方法的主要使用场景不是你这样的; 2.扩展方法有一定污染性; 3.扩展方法没法使用被扩展类私有成员; 4.其实你可以听下领导的看法(当然,有时候你领导技术不行的话会比较失望)。
感谢你的回复 但是呢,并不认可你所有回复 1,2,你这毫无说服力,如果可能,详细描述一下? 3.此处并不需要访问私有的,我做的设计,尽量都使用公开的属性。 4.我已经按照领导的做法修改了程序了。 a.不使用扩展方法,并很2的把生成的xml片段使用重写ToString的方式返回 b.不使用xml序列化方法,而且不使用XmlDocument,而是自己拼接几行类似xml的标签行 c.因为自创格式,所以无法用XmlDocument读取,只好自己用正则分析取回的数据 d.原本统一的一个处理,完全可以自描述的格式,现在已经拆开,需要一堆的switch...case了,Oh,yeah,我以前自认为是设计师,经过这个领导的“洗礼”,我终于知道“码农”和“设计师”之间思想的鸿沟以及“码农”为什么被称之为“码农”了,我惊人的发现,这样垃圾的写法,其实代码行增加了至少10倍,如果按代码行算工资,我已经可以比以前多拿很多奖金了,原来按代码行算收入是这类人!懂了!
by_封爱 版主 2014-10-31
  • 打赏
  • 举报
回复
引用 17 楼 romanchaos 的回复:
AsEnumerable
使用AsEnumable无非就是想让他可以使用where或者select.. 但是数组本身就有了where,select方法啊.. 难道

 int[] a = new int[1] { 1 };
 var b = a.AsEnumerable().First();
 var c=a.First();
b就行 c就不行了?? 这又不是DataTable 得需要

DataTable dt = new DataTable();
var q = dt.AsEnumerable().Where(d => d.Field<int>("age") > 8);
by_封爱 版主 2014-10-31
  • 打赏
  • 举报
回复
引用 19 楼 phommy 的回复:
楼主你为什么可以编辑帖子。。。好像也不是管理员啊 我编辑就说 您的权限无法使用此功能,请联系相关人员,获得使用此功能的权限,才可以使用。
如果没人回复就可以编辑.只要有人回复了 就不能编辑了...
引用 17 楼 romanchaos 的回复:
AsEnumerable
若若的问下 你知道AsParallel是什么意思不.......
phommy 2014-10-31
  • 打赏
  • 举报
回复
楼主你为什么可以编辑帖子。。。好像也不是管理员啊 我编辑就说 您的权限无法使用此功能,请联系相关人员,获得使用此功能的权限,才可以使用。
smthgdin_020 2014-10-31
  • 打赏
  • 举报
回复
1.扩展方法的主要使用场景不是你这样的; 2.扩展方法有一定污染性; 3.扩展方法没法使用被扩展类私有成员; 4.其实你可以听下领导的看法(当然,有时候你领导技术不行的话会比较失望)。
romanchaos 2014-10-31
  • 打赏
  • 举报
回复
AsEnumerable
romanchaos 2014-10-31
  • 打赏
  • 举报
回复
引用 12 楼 diaodiaop 的回复:
原来没用,不过这2天用了1次,感觉萌萌大...

 public static string ToHexString(this byte[] data)
        {
            return string.Join("-", data.AsParallel().Select(d => d.ToString("X2")).ToArray());
        }
 public static byte[] ToByte(this string s)
        {
            return s.Split('-').AsParallel().Select(x => Convert.ToByte(x, 16)).ToArray();
        }
瞬间感觉高大上有木有??? 还是很不错的...虽然我不知道这样用对不对.......
不要用AsParallel,用AsEnumable。
showjim 2014-10-31
  • 打赏
  • 举报
回复
扩展方法需要处理冲突问题,用好了是提高编码效率的利器。
约翰德鲁伊 2014-10-31
  • 打赏
  • 举报
回复
引用 1 楼 boss_george 的回复:
被领导这么一说,一点想干的欲望都没了,下午剩余1小时,看网页,混过去好了。
你这个心态不对。你要充分理解一下领导的语气意义。 领导的意思是:你就爱用怪异的写法,真可爱...........
by_封爱 版主 2014-10-31
  • 打赏
  • 举报
回复
原来没用,不过这2天用了1次,感觉萌萌大...


public static string ToHexString(this byte[] data)
{
return string.Join("-", data.AsParallel().Select(d => d.ToString("X2")).ToArray());
}
public static byte[] ToByte(this string s)
{
return s.Split('-').AsParallel().Select(x => Convert.ToByte(x, 16)).ToArray();
}






瞬间感觉高大上有木有???

还是很不错的...虽然我不知道这样用对不对.......





romanchaos 2014-10-31
  • 打赏
  • 举报
回复
引用 21 楼 diaodiaop 的回复:
[quote=引用 17 楼 romanchaos 的回复:] AsEnumerable
使用AsEnumable无非就是想让他可以使用where或者select.. 但是数组本身就有了where,select方法啊.. 难道

 int[] a = new int[1] { 1 };
 var b = a.AsEnumerable().First();
 var c=a.First();
b就行 c就不行了?? 这又不是DataTable 得需要

DataTable dt = new DataTable();
var q = dt.AsEnumerable().Where(d => d.Field<int>("age") > 8);
[/quote] 啊没留意到……我表达的意思就是AsParallel要慎用吧。
phommy 2014-10-31
  • 打赏
  • 举报
回复
引用 20 楼 diaodiaop 的回复:
[quote=引用 19 楼 phommy 的回复:] 楼主你为什么可以编辑帖子。。。好像也不是管理员啊 我编辑就说 您的权限无法使用此功能,请联系相关人员,获得使用此功能的权限,才可以使用。
如果没人回复就可以编辑.只要有人回复了 就不能编辑了...
引用 17 楼 romanchaos 的回复:
AsEnumerable
若若的问下 你知道AsParallel是什么意思不.......[/quote] 谢告知。。。 如果允许(比如你的类是自己的代码有完全的控制权),最好还是不进行扩展,而在类内部实现。至于调用方便问题,你定义个接口让这6个类都实现就好了
threenewbee 2014-10-30
  • 打赏
  • 举报
回复
扩展方法不宜滥用。 我们知道,接口和类继承有些共同点,但是接口不能在基类实现一些预置的方法,而这些方法独立出来似乎和接口本身又没有关联。扩展方法特别适合这个场合使用。 我强调的是,给一个类也好,接口也好,增加扩展方法,最好这两者都是一个开发者/团队所为,这样可以避免无谓增加扩展方法造成的函数名污染和可读性下降。
足球中国 2014-10-30
  • 打赏
  • 举报
回复
引用 7 楼 boss_george 的回复:
最终,下班后,领导指示:不要用XML序列化方法,而是每个类,自己写生成xml的代码。 真搞不懂,宁可大量的复制粘贴代码,看上去津津有味的。诶。郁闷。
如果你用xml序列化,估计以后后悔有的吃了。版本更新 时,当你的类更改,重构时,当你对用户已经有的数据再反序列化时,那时候去死的心都有。 写代码给自己看的,想怎么写都可以。但写代码给别人看时,最好你的写的代码是很多人都能看得懂的。
boss_george 2014-10-30
  • 打赏
  • 举报
回复
sp1234 感谢你的回复,办公室里,的确需要这样欠考虑,区别对待。
boss_george 2014-10-30
  • 打赏
  • 举报
回复
最终,下班后,领导指示:不要用XML序列化方法,而是每个类,自己写生成xml的代码。 真搞不懂,宁可大量的复制粘贴代码,看上去津津有味的。诶。郁闷。
fmonkey 2014-10-30
  • 打赏
  • 举报
回复
扩展方法应该说不要在代码中大量使用,因为大量使用意味着你的代码设计出现了问题 扩展方法主要是针对某一些类型来使用时较好,比如.net Framework中的IEnumerable接口的扩展
加载更多回复(5)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧