0

我有一个像这样的xml文件

<Config>
    <Allowed></Allowed>
</Config>

Allowed 标签的读取方式如下:

string isAllowed = (string)xml.Root
                              .Element("Config")
                              .Elements("Allowed")
                              .SingleOrDefault();

isAllowed 应该采用默认值 true 时

  1. 标签不存在
  2. 存在但为空
  3. 具有除 true、false、yes 或 no 以外的任何其他值。

这是执行此操作的代码:

if (isAllowed == null)
{
    DoSomething();
    return true;
}
if (isAllowed.Length == 0)
{
    DoSomething();
    return true;
}
if (isAllowed.Length != 0)
{
    if (isAllowed.ToUpper() != "FALSE" && isAllowed.ToUpper() != "NO")
    {
        DoSomething();
        return true;
    }
}

必须有更好的方法来做到这一点?

4

2 回答 2

5
if (isAllowed == null)
{
    DoSomething();
    return true;
}
if (isAllowed.Length == 0)
{
    DoSomething();
    return true;
}

可以替换为:

if (string.IsNullOrEmpty(isAllowed)
{
    DoSomething();
    Return true;
}

但实际上,鉴于您的标准,我认为string.IsNullOrWhiteSpace(isAllowed)更合适,因为如果标签的内容为“空”,它将返回 true。

此外,您第二次不需要以下条件,因为如果第一次满足条件,则函数将返回(短路评估)。这意味着您当前在第二个If块中的语句将永远不会被执行。

if (isAllowed.Length != 0)

我使这个更清洁的第一直觉是采取与乔恩在他的回答中所做的相同的方法,重复它没有任何优势。但是,我确实认为这是另一个不错的设计,因为如果您引入更多条件,它会干净:

private static bool Validate(string isAllowed)
{
    var defaultTrueConditions = new[] {"true", "false", "yes", "no"};
    if (string.IsNullOrWhiteSpace(isAllowed) ||
        defaultTrueConditions.Contains(isAllowed, StringComparer.OrdinalIgnoreCase))
    {
        DoSomething();
        return true;
    }
    return false;
}
于 2013-05-16T06:16:52.700 回答
1

听起来你可能会像这样更好:

// This deals with the nullity aspect. (The "Yes" is just for clarity - it could
// be any value other than "No" or "False" in some form.)
isAllowed = isAllowed ?? "Yes";

bool isFalse = isAllowed.Equals("No", StringComparison.OrdinalIgnoreCase) ||
               isAllowed.Equals("False", StringComparison.OrdinalIgnoreCase);

return !isFalse;

基本上你默认的事实true意味着返回值应该false你找到一个元素并且它的值是NoorFalse时,以不区分大小写的方式。请注意,我在这里使用了序数匹配 - 您可能想要更改它,例如 to CurrentCultureIgnoreCaseor InvariantCultureIgnoreCase

目前尚不清楚DoSomething方法调用的来源,但无论如何我都会将其分开。编写一种确定适当值的方法,如上所示 - 然后具有:

bool allowed = CheckAllowed(doc);
if (allowed)
{
    DoSomething();
}
// And use allowed here too

在我看来,这是一个更清晰的分离。

于 2013-05-16T06:18:40.137 回答