2017-02-21 28 views
0

我想要有一個代表長度的值對象。考慮到它是一種值類型,我寧願使用struct,但由於零長度沒有意義,所以我不得不使用class。將兩個長度加在一起看起來像是一個合理的操作,所以我想超載運算符+。我很好奇,但我應該如何處理添加null如何在爲類值對象重載operator +時處理null?

null添加到現有字符串會返回與現有字符串具有相同內容的字符串。將null添加到具有值的int?返回null

我可以看到一種情況,即將null添加到現有長度只是返回與現有長度具有相同值的新長度。同時,我可以看到添加null將被視爲錯誤的情況。我一直試圖找到一些指導,但一直沒有找到任何指導。有沒有一個共同的指導方針呢,還是每個應用程序都有所不同?

+0

零長度使得沒有更多的意義大於零的長度。 – Evk

回答

1

我會強烈建議使用struct您的長度和治療默認表示爲長度爲0。

,因爲零長度是沒有意義的,我被迫使用class

它是由你的代碼來治療長度struct的默認表示一些特定長度的表示。除了把它當作零長度,至少有兩種選擇:

  • 你可以把默認長度爲未知,在這種情況下,任何與它的操作將產生一個未知的,或者
  • 你可以把它作爲長度的「陷阱表示」,在這種情況下,任何操作都會產生異常。

這可能是一個設計錯誤,不要以統一的方式與所有其他數字對待零。具體來說,當減去長度值時,零長度可能會變得方便,因爲減去兩個長度相等的值將不會產生任何結果。

至於「未知」的長度而言,使用struct給你的Nullable<length>立即向您length結構的用戶熟悉方便的標準表示。

+0

鑑於我想在構造函數中對長度參數進行限制,'> 0',我不喜歡使用結構體。然而,'lengthA - lengthB'確實可以導致長度爲零,在這種情況下,我們需要能夠處理這種情況。所以要麼我不會重載標準算術運算符,要麼我允許零長度的對象。後者似乎是首選。完全錯過了這一點。 – user1323245

0

嚴格來說,現實中不存在零長度,一切都有長度。在處理結構時獲得空返回或NullReferenceException會導致我認爲我搞砸了構造函數或實例化。換言之,空引用將在應用程序的範圍內使用,而不會暴露給客戶端。

struct length = new MyStruct(); //no! 
struct length = new MyStruct(double feet, double inches) //better... 

struct length = 34.5; //ok... 
0

簡單的答案: 如果你允許你的系統中添加空,那麼你或許應該保留現有的值,並把它像一個0,像這樣:

public static NullNumber operator+ (NullNumber b, NullNumber c) { 
    return (b ?? 0) + (c ?? 0); 
} 

高級答: 您將可能是正確的在0長度沒了感覺,你說得對,加空似乎是一個錯誤 我不能看到字段被填充在那裏,但我懷疑之一: 你沒有要求您在長度,如果通過構造函數這是必需的。 或者你有一個錯誤的類,它有時具有長度,有時這意味着它聽起來更接近2班