Хорошо ... «лучший» ответ (очень самоуверенный, но у меня есть право), когда вам не нужно проводить различие между двумя, потому что существует только одно возможное состояние, которое является действительным:
class MyModel
{
public int Id {get; private set;}
public string Title {get; private set;}
public DateTime CreatedDate {get; private set;}
public bool IsActive {get; private set;}
Public MyModel(int Id, string Title, DateTime CreatedDate, bool IsActive)
{
this.Id = Id;
this.Title = Title;
this.CreatedDate = CreatedDate;
this.IsActive = IsActive;
}
}
Я знаю, что это не всегда возможно, например, Query by Example.
Использование «магических чисел», таких как «Установка значения идентификатора в 0, имеет смысл ...», как правило, избегается.Как только вы сделаете это сейчас, каждый код, который вы пишете, должен быть закодирован, чтобы знать, что это за магическое число и что они значат.Это редко достигается и полно неприятного кода и кода, подверженного ошибкам.
Если вы просто ДОЛЖНЫ иметь различие между полем, имеющим значение, и нет, ваш более поздний пример немного лучше.По крайней мере, здесь вы типы значений явно допустимы или недействительны.Однако использование Nullable означает, что вы должны использовать другое средство, чтобы определить, является ли класс, строка или другой ссылочный тип недопустимым.
ИМО, вам лучше со следующим, хотя, как вы увидите, оно становится очень многословным.
class MyModel
{
private int _id;
public bool HasId { get; set; }
public int Id
{
get
{
if (!HasId) throw new System.InvalidOperationException();
return _id;
}
set
{
HasId = true;
_id = value;
}
}
private string _title;
public bool HasTitle { get; set; }
public string Title
{
get
{
if (!HasTitle) throw new System.InvalidOperationException();
return _title;
}
set
{
if (value == null) throw new System.ArgumentNullException("Title");
HasTitle = true;
_title = value;
}
}
private DateTime _createdDate;
public bool HasCreatedDate { get; set; }
public DateTime CreatedDate
{
get
{
if (!HasCreatedDate) throw new System.InvalidOperationException();
return _createdDate;
}
set
{
HasCreatedDate = true;
_createdDate = value;
}
}
private bool _isActive;
public bool HasIsActive { get; set; }
public bool IsActive
{
get
{
if (!HasIsActive) throw new System.InvalidOperationException();
return _isActive;
}
set
{
HasIsActive = true;
_isActive = value;
}
}
}
Наконец, если вы идете по этому маршруту, генератор кода будет вам полезен.