Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 最简洁/最惯用的方法在C中重写#_C#_Refactoring_Code Snippets_Code Readability_Conditional Statements - Fatal编程技术网

C# 最简洁/最惯用的方法在C中重写#

C# 最简洁/最惯用的方法在C中重写#,c#,refactoring,code-snippets,code-readability,conditional-statements,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;

我有一个
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
}
这是如此简单,我相信有一个更简洁,更可读的方式来表达这一点

注意:如果不是因为VS在默认情况下强加的荒谬的“每行一个括号”规则,我可能不会这么烦恼。例如,在VB中,我可能会从这个代码块中丢失大约10行!(作为旁白,你有什么想法?

这个怎么样:

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;
}
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;
那么这个呢:

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

一个选项是使
VMLDimensionType
a
Flags
枚举:

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

我想提取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();


如果我没有算错,VB.NET版本会短7行,没有大括号的版本会短12行。你能发布
VMLDimensionType
enum吗?如果它是一个标志枚举,可能会更简单。@Ani已用枚举更新definition@El:好的,只需更改默认值。VS允许这样做。将每个大括号放在这样的额外行上真的是一种浪费,不会提高可读性(IMHO)。在我发布以下内容之前,我没有看到Chibacity的评论:)是的,但不是最整洁的。他的更好imo@1啊,有点谦虚!+1我很喜欢这个解决方案的可读性。它仍然很大,但这可能只是我习惯了所有这些大括号:)@El Ronnoco On single line statements您可以删除大括号-但我建议保留大括号,因为这样可以更轻松地合并源代码管理中的更改,并为您提供一个您可以查看的确定分组。@Will yes,当我第一次开始使用C时,我曾经为单行代码块省去大括号。然后我不得不做一些更改它们是两行代码块…用最少的行数编码不是最好的IMHO。代码行数越少,可读性越好。这一行符合要求。+1我喜欢它,实际上很好,可读性很好。有点像从图表上阅读。与其他代码类似,但仍然..抱歉,我已将我接受的答案更改为Ani的他们让枚举反映正在发生的事情的逻辑的方式。嗯,我可能不得不改变我接受的答案:)这更有意义,因为枚举反映的是实际的逻辑…@cibacity Full在设置大小和位置时是隐式的。这就是它的美妙之处。做合乎逻辑的
就可以做到这一点。@El Ronnoco:该死的,我需要一些睡眠-当然需要,我太密集了-doh!你为什么要写
1@Oliver:你说得对,我可以做到。这是我通常编写标志枚举的方式。对我来说,它澄清了我们正在设置第二位(1左移一位)。顶部、左侧、宽度和高度从哪里来?或者它们是作为成员访问的?是的,我想这是某个对象的成员。无论如何,如果它们不是,您可以将它们作为参数传递。+1表示mid函数返回。请注意,它们将所有其他解决方案的
else if
s很好地转换为更简单的
if
s。