2011-08-02 24 views
4

我正在寫一些顯式運算符來將數據庫模型類型轉換爲我的域模型。像這樣(簡化的例子):應該顯式運算符在c#中返回null嗎?

public static explicit operator DomainModel.Role(Role roleEntity) 
{ 
    DomainModel.Role role = new DomainModel.Role 
    { 
     RoleId = roleEntity.RoleId, 
     Name = roleEntity.Name 
    }; 

    return role; 
} 

然而,它有可能是roleEntity參數爲null。大多數時候在.net框架中顯式強制轉換null實例會導致異常。像這樣:

user.Role = (DomainModel.Role)_userRepository.GetRole(user); // Would normally results in a NullReferenceException 

但如果明確運營商將進行調整,如預期上述將發揮作用:

public static explicit operator DomainModel.Role(Role roleEntity) 
{ 
    DomainModel.Role role = roleEntity == null ? null : new DomainModel.Role 
    { 
     RoleId = roleEntity.RoleId, 
     Name = roleEntity.Name 
    }; 

    return role; 
} 

問:

  • 它是合乎邏輯的創造這樣明確的運營商?
+1

我會認真考慮寫一個名字空間前綴的第二個角色。 –

回答

5

對於標題問題:允許顯式操作符拋出(而隱式操作符不應該)。

但是否null是一個有效的理由這是一個設計決定,我不認爲。

考慮:

object x = null; 
string t = (string)x; 

這確實拋出。

+0

我想你說得對。有些預期的行爲是拋出NullReferenceException。 –

2

我會使用庫,如AutoMapper來促進類似類型之間的轉換。您可以獲得更大的靈活性並且編寫更少的代碼恕我直言,使用顯式的轉換操作符在閱讀代碼時不太容易理解,它給人的印象是它是一個便宜的操作,因爲它可能是非常複雜的映射代碼。

+0

瞭解你的想法。感謝您的建議。 –

1

我想是的。將一個null引用引用到另一個類型通常應該導致null引用,以與正常的語義進行匹配。

例如因爲這個工程:

object x = null; 
var role = (DomainModel.Role)x; 

這也應該工作:

Role x = null; 
var role = (DomainModel.Role)x; 
1

恕我直言意見沒有,你不應該這樣做。

我看見的都是沒有區別:

string myString= (string)null; 

Object o = null; 
string myString= (string)o; 

在這兩種情況下,我想一個null返回這是默認的行爲(我不會推薦一個NullReferenceException無論是作爲以上兩個代碼片段都是完全有效的:兩個顯式轉換都返回null)。

我會覺得有點迷惑,一個null引用可以以某種方式轉換成默認對象:

object o = null; 
string myString = (string)o; //myString == String.Empty WTF? 

如果這種情況下是有道理我會實現它通過構造函數或特定的靜態方法,它在哪裏清楚你是創建一個新對象,從來沒有通過一個隱式或顯式運算符。

演員操作員應該做的只是做什麼:從一種類型轉換爲另一種類型。 null只能「轉換」爲null

+0

@亨克霍爾特曼:沒有。問題是我不確定C#中的默認行爲是什麼。一旦我證實鑄造null不會拋出,那麼答案顯而易見,IMO(我錯誤地認爲默認行爲是拋出)。基本思想保持不變:不要改變預期的行爲。 – InBetween

+0

而我錯誤閱讀了編輯歷史記錄。抱歉。 –