2017-06-19 40 views
2

我想在theme.VersionStamp插入另一個空檢查。有沒有一種方法可以將它插入SequenceEqual參數中?空傳播 - 第二空檢查

if (theme.VersionStamp != null) 
{ 
    if (!origTheme?.VersionStamp.SequenceEqual(theme.VersionStamp) ?? false) 
    { 
     throw new TwConcurrencyException(); 
    } 
} 
+0

_「我想插入另一個空檢查的主題」_ - 爲什麼?當你到達代碼的那一部分時,你已經知道這個值不是'null'。那裏有一個空檢查的重點是什麼?如果有一點,你想要什麼樣的空檢查?你想要什麼結果?解決你的問題,使其包含一個很好的[mcve],清楚地表明你正在做什麼,解釋代碼的作用,以及你想要它做什麼,以及具體是什麼,你無法弄清楚。 –

回答

1

它不是必需的,因爲正確反正你製作的空檢查if (theme.VersionStamp != null){,然後出發。但是,你仍然可以再次檢查和傳遞的默認參數一樣

if (!origTheme?.VersionStamp.SequenceEqual(theme.VersionStamp ?? new VersionStamp()) ?? false) 

另外,我想你的第一個null檢查延伸到下面

if (theme != null && theme.VersionStamp != null) 
{ 
+0

「主題」總是有價值的。 theme.versionstamp可以是空的。 – jengfad

+0

如果'theme'也可以爲null,則第一個檢查可以是'if(theme?.VersionStamp!= null)',它將封裝兩者。 –

+0

因此,我檢查了代碼的原始作者,結果發現當某個邏輯被擊中時,他錯過了填充對象的版本標記,這就是爲什麼我得到空版本戳的實例。無論如何,感謝您的幫助,我學到了很多東西。 :) – jengfad

1

不幸的是,路過的時候一種說法是添加空校驗不可能。

你可以得到最短的是:

if (theme?.VersionStamp == null || 
    !origTheme?.VersionStamp?.SequenceEqual(theme.VersionStamp) ?? false) 
{ 
    throw new TwConcurrencyException(); 
} 

我不會傳似拉胡爾的默認參數是幹什麼的,因爲如果origThemeVersionStamp等於默認VersionStampSequenceEqual會錯誤地返回true

+1

使用C#7和[Throw Expressions](https://github.com/dotnet/roslyn/issues/13389)現在可以這樣做:'.SequenceEqual(theme.VersionStamp ?? throw new ArgumentException(...) )但是,在這個**案件中,由於前面的if語句,它是不必要的。 –