我的一个同事想到了这个,我想知道其他人怎么想?我个人觉得很有趣,但是想知道它是否太大了?下面的代码示例。扩展方法在底部。

请一般的想法。可以添加其他扩展方法吗?

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/

10-13 01:34