При создании 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.