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

El *_*oco 2 c# refactoring code-readability code-snippets 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

enum被称为是:

private enum VMLDimensionType
{
    unset = 0,
    full = 1,
    size = 2,
    position = 3
}
Run Code Online (Sandbox Code Playgroud)

它非常简单,我确信有更简洁,更易读的方式来表达这一点.

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

Tim*_*oyd 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;
}
Run Code Online (Sandbox Code Playgroud)


Ani*_*Ani 8

一种选择是做VMLDimensionType一个Flags枚举:

[Flags]
enum VMLDimensionType
{
    Unset = 0,
    Size = 1,
    Position = 1 << 1,
    Full = Size | Position
}
Run Code Online (Sandbox Code Playgroud)

然后:

ret.Type = VMLDimensionType.Unset;

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

if (top != null && left != null)
    ret.Type |= VMLDimensionType.Position;
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 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;
}
Run Code Online (Sandbox Code Playgroud)