Должны ли явные операторы возвращать ноль в c #? - PullRequest
4 голосов
/ 02 августа 2011

Я пишу некоторые явные операторы для преобразования типов модели базы данных в мою модель домена.Вот так (упрощенный пример):

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

   return role;
}

Однако возможно, что параметр roleEntity равен нулю.В большинстве случаев .NET Framework явное приведение нулевого экземпляра приводит к исключению.Вот так:

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

Вопрос:

  • Этологично создавать такие явные операторы?

Ответы [ 4 ]

5 голосов
/ 02 августа 2011

К вопросу о заглавии: явный оператор разрешается бросать (в то время как неявный оператор не должен).

Но то, является ли null веской причиной для этого, является дизайнерским решением, я бы не подумал.

Рассмотрим:

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

, который не бросает.

2 голосов
/ 02 августа 2011

Я бы использовал библиотеку, такую ​​как AutoMapper , чтобы облегчить преобразование между похожими типами.Вы можете получить большую гибкость и писать меньше кода.ИМХО, использование явных операторов приведения менее понятно при чтении кода, но создается впечатление, что это дешевая операция, когда это может быть довольно сложный код отображения.

1 голос
/ 02 августа 2011

ИМХО мнения нет, не стоит этого делать.

Я не вижу никакой разницы между:

 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.

1 голос
/ 02 августа 2011

Я думаю, что да.Приведение ссылки null к другому типу обычно должно приводить к ссылке null, чтобы соответствовать нормальной семантике.

, например, так как это работает:

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

Это также должноработа:

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