我的一个同事想到了这个,我想知道其他人怎么想?我个人觉得很有趣,但是想知道它是否太大了?下面的代码示例。扩展方法在底部。
请一般的想法。可以添加其他扩展方法吗?
var ddl = Page.FindControl("LocationDropDownList") as DropDownList;
ddl.Visible = true;
ddl.SelectedValue = "123";
if(isAdmin)
ddl .SelectedValue = "111";
成为:
Page.FindControl("LocationDropDownList")
.CastAs<DropDownList>()
.With(d => d.Visible = true)
.With(d => d.SelectedValue = "123")
.WithIf(isAdmin, d => d.Items.Add(new ListItem("Admin", "1")));
要么:
Page.FindControl("LocationDropDownList")
.CastAs<DropDownList>()
.With(d =>
{
d.Visible = true;
d.SelectedValue = "123";
})
.WithIf(isAdmin, d => d.SelectedValue = "111");
扩展方法:
public static TResult CastAs<TResult>(this object obj) where TResult : class
{
return obj as TResult;
}
public static T With<T>(this T t, Action<T> action)
{
if (action == null)
throw new ArgumentNullException("action");
action(t);
return t;
}
public static T WithIf<T>(this T t, bool condition, Action<T> action)
{
if (action == null)
throw new ArgumentNullException("action");
if (condition)
action(t);
return t;
}
最佳答案
在我编写清晰代码的经验法则中,包括:将所有副作用都放入语句中;非陈述式表达应该没有副作用。
该程序的第一个版本显然遵循此规则。第二个版本显然违反了它。
还有一个想法:如果我要像显示的代码一样阅读代码,我自然会认为代码的目的是建立一个表示这些操作的惰性评估结构-这正是为什么查询理解的原因C#3是通过这种方式构建的。查询表达式的结果是一个对象,该对象表示查询的延迟应用。
如果您打算捕捉“在我选择的稍后时间延迟执行这些副作用”的概念,那么这是一种明智的方法。本质上,您要构建的是副作用单子(monad)。如果您只是想为急切执行的代码提供不同的语法,那么这只是令人困惑,冗长且不必要。
关于c# - 更流畅的C#/.NET,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1916260/