2

Neatest /最習慣的方式我有這if-else聲明,這是我想要的。它所做的事很簡單,就像你應該能夠說明的一樣。重寫這個如果在C#

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行! (任上,作爲一個擱置的想法?)

+0

如果我不計數錯誤吧,VB.NET版本將是7號線較短,沒有括號12行版本。 – Bobby 2011-01-05 11:55:57

+0

你可以發佈'VMLDimensionType'枚舉嗎?如果它是一個Flags枚舉,它可能會更簡單。 – Ani 2011-01-05 11:58:23

+0

@Bobby Correctomundo :) – 2011-01-05 11:58:29

回答

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; 
+0

嗯,我可能不得不改變我接受的答案:)這更有意義,因爲枚舉反映了實際的邏輯... – 2011-01-05 12:09:01

+0

這不處理'完整'。 – 2011-01-05 12:12:03

+1

@cibacity當Size和Position都被設置時,Full是隱含的。這是它的美麗。做邏輯「或」使這發生。 – 2011-01-05 12:14:27

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

+1我很喜歡這個解決方案給出的可讀性。它仍然很大,但這可能只是我習慣了所有這些大括號:) – 2011-01-05 12:02:33

+0

@El Ronnoco在單行語句中,您可以移除大括號 - 我會建議保留它們,因爲它可以更輕鬆地合併源代碼管理中的更改,並給你一個明確的分組,你的眼睛可以跑過去。 – 2011-01-05 12:09:58

+0

@是的,當我第一次開始使用C#時,我曾經忽略了單行代碼塊的大括號。然後,我不得不使其中一些線路代碼塊...... – 2011-01-05 12:16:16

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

線數最少的編碼不是最好的恕我直言。具有清晰可讀性的行數較少的代碼使其成爲最佳代碼。這個符合法案。 – 2011-01-05 12:04:20

+0

+1我喜歡它,其實很好看。有點像從圖表中讀取。與其他人類似,但仍然.. – 2011-01-05 12:07:38

+0

道歉,我已經改變了我對Ani的接受答案,因爲我喜歡他們使枚舉反映正在發生的邏輯的方式。 – 2011-01-05 12:10:16

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; 
+0

沒有看到Chibacity的評論之前,我張貼:( – TJHeuvel 2011-01-05 12:00:32

+0

嗯,它是最短的... – 2011-01-05 12:01:24

+0

+1最短! – 2011-01-05 12:04:22

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(); 
+0

'top,left,width'和'height'從哪裏來?還是他們被作爲成員訪問? – 2011-01-05 12:18:57

+0

是的,我想這是某個對象的成員。無論如何,如果他們不是,你可以將它們作爲參數傳遞。 – 2011-01-05 12:22:30

+0

+1爲中等功能回報。注意他們如何很好地將所有其他解決方案的其他解決方案變成簡單的「if」。 – 2011-01-05 13:27:49