更流畅的C#/.NET我的一个同事想出了这个,不知道其他人怎么看?就个人而言,我觉得它很有趣,但想知道它是否太大了?代码示例如下。底部的扩展方法。请一般的想法。可以添加其他扩展方法吗?varddl=Page.FindControl("LocationDropDownList")asDropDownList;ddl.Visible=true;ddl.SelectedValue="123";如果(isAdmin)ddl.SelectedValue=“111”;变为:Page.FindControl("LocationDropDownList").CastAs().With(d=>d.Visible=true).With(d=>d.SelectedValue="123").WithIf(isAdmin,d=>d.Items.Add(newListItem("Admin","1")));或:Page.FindControl("LocationDropDownList").CastAs().With(d=>{d.Visible=true;d.SelectedValue="123";}).WithIf(isAdmin,d=>d.SelectedValue="111");扩展方法:publicstaticTResultCastAs(thisobjectobj)whereTResult:class{returnobjasTResult;}publicstaticTWith(thisTt,Actionaction){if(action==null)thrownewArgumentNullException("action");动作(t);返回吨;}publicstaticTWithIf(thisTt,boolcondition,Actionaction){if(action==null)thrownewArgumentNullException("action");如果(条件)动作(t);返回吨;我编写干净代码的经验法则是:将所有副作用放在语句中;非语句表达式应该没有副作用您的程序的第一个版本明确遵循此规则。第二个版本显然违反了它。另一个想法:如果我要阅读您所展示的代码,我自然会假设代码的目的是构建一个代表这些操作的惰性评估结构——这就是查询理解的目的。C#3就是这样构建的。查询表达式的结果是一个对象,表示查询的惰性应用。如果您的意图是捕捉“在我选择的稍后阶段以延迟方式执行这些副作用”的概念,那么这是一个明智的方法。基本上你正在构建的是一个有副作用的monad。如果您的意图只是为急切执行的代码提供不同的语法,那么这只会令人困惑、冗长且不必要。除了让读者感到困惑之外,我看不到任何好处。关于我的回答者,我想知道哪个星球更具可读性。据我所知,第一个版本或多或少具有完美的可读性,而这个可读性很强,但让读者想知道With和WithIf之间是否发生了一些奇怪的魔法。与第一个版本相比,它更长、更难打字、更不显眼且性能更差。我想我看不出新版本会给你带来什么。原文很清楚,少啰嗦。我想它会更快。我会避免(滥用?)这样的语言功能,除非有明显的好处。另一票投给“无用”。除了With方法包装序列语句外,With扩展方法什么都不做。C#已经有一个用于排序语句的内置函数,称为;。类似地,WithIf包装了一个if语句而不对控制流进行任何修改。在我看来,您只是在邀请自己采用以下方法:publicstaticTFor(thisTt,intstart,Funccond,Actionf){for(inti=start;cond(i);i++){f(t,i);}返回t;原文更具可读性。最简单的API更改是使FindControl()返回的对象成为类似Builder的对象(其中所有设置方法都返回“this”):Page.FindControl("LocationDropDownList").setVisible(true).setSelectedValue(isAdmin?"111":"123");这是一个有趣的扩展用途,我很欣赏它的优点。我不确定我会使用它,但如果您的团队喜欢它,一定要使用它。如果我看过它,这是对扩展方法的一些滥用!它们只是不同的编码风格,“太大而无法离开”是什么意思?留下什么?从你习惯的?只有你能决定。我会说VB的With块对代码可读性弊大于利,我不会尝试复制C#中的行为,但这只是我的偏好。我几乎总是将它用于FindControl(是的,强类型化为RepeaterItem,它不一定是,但这是我唯一使用过的东西):publicstaticTFindControl(thisRepeaterItemitem,stringid){returnitem.FindControl(id)为T;}并调用它:LiteralmyLiteral=e.Item.FindControl("myLiteral");我对第一个版本感觉更舒服。阅读和理解的时间更少。我同意扩展方法很好,如果您熟悉并且熟悉With方法,但在这种情况下它有什么好处呢?次要的。根据个人经验,我会更改:if(isAdmin)ddl.SelectedValue="111";到if(isAdmin){ddl.SelectedValue="111";}或if(isAdmin){ddl.SelectedValue="111";这可以节省调试时间。如果这是一个语言特性:With(Page.FindControl("LocationDropDownList")asDropDownList){Visible=true;SelectedValue="123";如果(isAdmin)添加(新列表项(“111”));你会赢得一些东西:上面试图模仿风格而没有获得好处。货物崇拜。(注意:我确实理解反对它的各种论点,但它仍然很好)顺便说一句,我的一些C++Win32UIHelpers包含使用类似于您要实现的链接的设置器:LVItem(m_lc,idx)。设置文本(_T(“你好”))。SetImg(12).SetLParam(id);在那种情况下,我至少赢得了“无冗余”,但那是因为我没有属性。我预测整个“平滑界面”时尚将成为2000年代的“匈牙利符号”。就我个人而言,我认为它看起来不是很干净,如果你有多个开发人员,他们都有自己的偏好,它可能会非常不一致。看起来你的同事是Lambda瘾君子。我认为可读性问题是主观的,我个人对你所做的没有任何问题。如果您的组织“批准”它,我会考虑使用它。我认为这个概念是合理的,如果将“With”更改为“Let”,它会更“实用”或“F#-ish”。个人想法。Page.FindControl("LocationDropDownList").CastAs().Let(d=>d.Visible=true).Let(d=>d.SelectedValue="123");我的2美分:它看起来不错,我唯一的评论是当你实际设置属性时,“有”意味着“哪里”或“有”。我建议使用“Execute”、“Execute”或“Set”之类的方法名称,但也许这只是我的怪异世界观。怎么样:Page.WithControl("LocationDropDownList").Do(d=>d.Visible=true).Do(d=>d.SelectedValue="123").DoIf(isAdmin,d=>d.Items.Add(newListItem("Admin","1")));我会坚持使用第一个版本。您发布的内容太聪明了,无法立即对阅读您的代码的人有用。您甚至可以更进一步,取消“var”:DropDownListddl=(DropDownList)Page.FindControl("ddlName");这是一个完美的学习案例,教你如何让事情变得比它需要的更复杂。第一个版本是明确的,不需要超出正常语言结构的额外知识。我说坚持使用没有扩展方法或lamba表达式的第一个版本。这些都是相对较新的概念,因此没有多少开发人员可以处理它们,而是在数据库中的数据检索/操作之外使用它们。如果您使用它们,您可能会支付维护费用。很高兴地说“如果这对你来说是希腊语”;但在现实生活中,这可能是最好的方式。关于“流畅的接口”,C#已经为初始化程序提供了很好的语法,这(恕我直言)更好,请尝试使用流畅的风格。当然,在您的示例中,您不是在初始化一个新对象,而是在改变一个现有对象。我对Fluent界面的全部专业知识来自对维基百科的30秒扫描,但我认为JeeBee的回答更符合Fluent编程的精神,尽管我可能会对其进行一些更改:Page.FindDropDownList("LocationDropDownList").setVisible(true).setAdminSelectedValue("111").setSelectedValue("123")有些人可能会争辩说这更具可读性,尤其是对于没有属性的语言,但我仍然认为它在C#中没有意义。在某些情况下,构造良好的流畅界面可能非常有用。首先,由于向开发人员提供的选项数量有限,因此他们(通常)很容易做出正确的选择,但很难做出正确的选择。其次,由于句子类似于结构,因此它们可以成为表达您的意图的一种很好而清晰的方式,尤其是在构建复杂对象时。我发现在开发测试代码时,流畅的接口非常有用,在这种情况下,通常需要构建大量域对象并稍作更改。我还成功地使用它们作为引入装饰器模式和消除过多方法重载的方法。如果有人有兴趣了解有关流畅接口的更多信息,我建议您查看MartinFowler正在进行的这项工作。好的经验法则:如果您对代码的第一印象是“这很聪明”——这可能不是一个好主意。好的代码应该简单、可读,并且只在绝对必要时才“聪明”。以上就是《C#学习教程:更流利的C#/.NET》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处:
