更流利的C#/ .NET如何实现?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (22)

我的同事提出了这个问题,我想知道别人怎么看?就个人而言,我觉得它很有趣,但不知道它是否太大了离开?下面的代码示例。底部的扩展方法。

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

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。如果你的意图仅仅是为急切执行的代码提供不同的语法,那么这只是混淆,冗长而不必要的。

用户回答回答于

除了让读者感到困惑之外,我认为这并没有什么好处。关于我的同事回答者,我想知道哪个星球更具可读性。至于我可以告诉大家,第一个版本或多或少都有完美的可读性,而这是相当可读,但使读者怀疑是否有一些奇怪的魔法之内发生的事情WithWithIf

与第一个版本相比,它更长,更难打字,不太明显,性能也更差。

扫码关注云+社区