c# - 返回第一个有效的方法,更优雅的方法?

标签 c# design-patterns

最近我发现自己在编写连续调用其他方法的方法,并根据首先返回适当值的方法设置一些值。我一直在做的是用一种方法设置值,然后检查该值,如果它不好,那么我检查下一个。这是最近的一个例子:

private void InitContent()
{
    if (!String.IsNullOrEmpty(Request.QueryString["id"]))
    {
        Content = GetContent(Convert.ToInt64(Request.QueryString["id"]));
        ContentMode = ContentFrom.Query;
    }

    if (Content == null && DefaultId != null)
    {
        Content = GetContent(DefaultId);
        ContentMode = ContentFrom.Default;
    }

    if (Content == null) ContentMode = ContentFrom.None;
}

如果 id 不在数据库中,GetContent 方法应该返回 null。这是一个简短的示例,但您可以想象如果有更多选项,这会变得多么笨拙。有更好的方法吗?

最佳答案

空合并运算符可能具有您想要的语义。

q = W() ?? X() ?? Y() ?? Z();

本质上是一样的:

if ((temp = W()) == null && (temp = X()) == null && (temp == Y()) == null)
    temp = Z();
q = temp;

也就是说,q是W()、X()、Y()的第一个非空值,或者如果它们都为空值,则为Z()。

您可以链接任意多个。

确切的语义与我勾画的不太一样;类型转换规则很棘手。如果您需要确切的详细信息,请参阅规范。

关于c# - 返回第一个有效的方法,更优雅的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5399091/

相关文章:

c# - 数据集写入文件

c# - 如何将 NancyFX 从 1.2 版更新到 1.4.4 版

design-patterns - 规范模式和 DDD

c++ - 编写 JSON 解释器的设计问题

c# - 在 MVVM 中,每个 ViewModel 是否只耦合到一个 Model?

java - 如何避免代码重复?

c# - 检查 Controller 和 View 中的权限

c# - 使用内存中查询实现自定义 QueryProvider

design-patterns - GOF 单例模式有任何可行的替代方案吗?

c# - 如何正确使用 distinct 和 compare?