При создании POCOs или простых DTO я могу использовать структуры вместо классов?
public class Customer
{
public int CustomerId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public struct Customer
{
public int CustomerId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
Ответы
Ответ 1
Второй фрагмент - это изменяемая структура. Это действительно плохая идея, IMO - они ведут себя странно в разных ситуациях, поскольку значения могут быть скопированы, если вы не можете ожидать, что они будут.
Конечно, вы можете создавать неизменяемые структуры, и есть моменты, когда это подходит, но лично я считаю поведение ссылочного типа более естественным. С structs вам также нужно беспокоиться о том, что независимо от того, какие конструкторы вы устанавливаете на место, всегда можно установить переменную в значение по умолчанию - так что поля будут равны нулю для числовых типов, null для ссылочных типов и т.д. Это раздражает должны иметь дело с возможностью недействительного объекта повсюду, тогда как с классами вы можете добавить соответствующую проверку методу конструктора (или factory), чтобы убедиться, что единственное, что вам нужно беспокоиться, - это нулевая ссылка.
Аргумент эффективности заканчивается сложным, так как есть плюсы и минусы с обеих сторон, в зависимости от того, что вы делаете с объектами.
Чтобы сократить длинный ответ короткий (слишком поздно?) - я бы использовал классы по умолчанию; сохранять типы значений для вещей, которые являются естественными индивидуальными значениями (например, "время во времени" или "целое число" ).
Ответ 2
Вот ссылка на различия между структурами и классами:
http://msdn.microsoft.com/en-us/library/aa288471%28VS.71%29.aspx
Он утверждает, что структуры более эффективны, но я думаю, что pass by ref более эффективен, а затем передается по значению для больших данных.
Это может быть проблемой:
"Хотя CLR позволяет это, С# не допускать, чтобы структуры имели значение по умолчанию безпараметрический конструктор. Причина что для типа значения компиляторы по умолчанию не генерируются значения по умолчанию конструктора, и они не генерируют вызовите конструктор по умолчанию. Так, даже если вам удалось определить конструктор по умолчанию, он не будет и это только смутит вас. Чтобы избежать таких проблем, С# компилятор запрещает определение пользовательский конструктор по умолчанию. А также потому что он не генерирует значение по умолчанию конструктор, вы не можете инициализировать поля при их определении, например: Collapse
struct MyWrongFoo { int x = 1; }
Помните, что компилятор ставит все это код инициализации в конструктор (каждый конструктор) и потому что нет дефолта конструктор, вы не можете выполнить инициализации.
Теперь, для забавной части.. Вы обычно создайте структуру следующим образом:"
http://www.codeproject.com/KB/cs/structs_in_csharp.aspx
Ответ 3
POCOs и DTO - это не одно и то же.
POCO - это бизнес-объект, который обычно имеет состояние и поведение.
A DTO - это легкий объект для переноса состояния между уровнями приложения.
Я бы, очевидно, использовал классы для POCOs, а также для DTO.