Самый лучший / самый идиоматический способ переписать это если в C # - PullRequest
2 голосов
/ 05 января 2011

У меня есть 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 ]

9 голосов
/ 05 января 2011
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;
}
8 голосов
/ 05 января 2011

Один из вариантов: VMLDimensionType a 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;
5 голосов
/ 05 января 2011

Как насчет этого:

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;
}
1 голос
/ 05 января 2011

Я хотел бы извлечь метод 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();
1 голос
/ 05 января 2011

Что по этому поводу:

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;
...