在C#中重写此最佳/最惯用的方法

时间:2011-01-05 11:52:40

标签: c# refactoring code-snippets code-readability conditional-statements

我有这个if-else声明可以满足我的需要。正如你应该能说的那样,它正在做的事情非常简单。

if (width != null && height != null)
{
    if (top != null && left != null)
    {
        ret.type = VMLDimensionType.full;
    }
    else
    {
        ret.type = VMLDimensionType.size;
    }
}
else
{
    if (top != null && left != null)
    {
        ret.type = VMLDimensionType.positon;
    }
    else
    {
        ret.type = VMLDimensionType.unset;
    }
}

提到的enum是:

private enum VMLDimensionType
{
    unset = 0,
    full = 1,
    size = 2,
    position = 3
}

这是如此简单,我确信有更简洁,更易读的方式来表达这一点。

NB如果不是因为默认情况下VS强加的荒谬的“每条一条线”规则我可能不会那么烦恼。例如在VB中,我可能会从此代码块中丢失大约10行! (关于这一点的任何想法?)

5 个答案:

答案 0 :(得分:9)

bool hasPosition = (top != null && left != null);
bool hasSize = (width != null && height != null);

if (hasSize)
{
    ret.type = hasPosition ? VMLDimensionType.full : VMLDimensionType.size;
}
else
{
    ret.type = hasPosition ? VMLDimensionType.positon : VMLDimensionType.unset;
}

答案 1 :(得分:8)

一种选择是VMLDimensionType Flags枚举:

[Flags]
enum VMLDimensionType
{
    Unset = 0,
    Size = 1,
    Position = 1 << 1,
    Full = Size | Position
}

然后:

ret.Type = VMLDimensionType.Unset;

if(width != null && height != null)
    ret.Type |= VMLDimensionType.Size;

if (top != null && left != null)
    ret.Type |= VMLDimensionType.Position;

答案 2 :(得分:5)

这个怎么样:

bool hasSize = width != null && height != null;
bool hasPosition = top != null && left != null;

if (hasSize && hasPosition)
{
    ret.type = VMLDimensionType.full;
}
else if (hasSize && !hasPosition)
{
    ret.type = VMLDimensionType.size;
}
else if (!hasSize && hasPosition)
{
    ret.type = VMLDimensionType.positon;
}
else
{
    ret.type = VMLDimensionType.unset;
}

答案 3 :(得分:1)

这个怎么样:

if(width != null && height != null)
    ret.type = top != null && left != null ? VMLDimensionType.full : VMLDimensionType.size;
else
    ret.type = top != null && left != null ? VMLDimensionType.positon : VMLDimensionType.unset;

答案 4 :(得分:1)

我想提取GetDimensionType()方法。 并且它不是那么小,而是更具可读性和自我描述性。

private VMLDimensionType GetDimensionType()
{
    bool hasSize = width != null && height != null;
    bool hasPosition = top != null && left != null;

    if (hasSize && hasPosition)
        return VMLDimensionType.full;

    if (hasSize)
        return VMLDimensionType.size;

    if (hasPosition)
        return VMLDimensionType.positon;

    return VMLDimensionType.unset;
}

用法:

ret.type = GetDimensionType();