Должен ли я использовать Struct вместо облегченного класса данных для моих данных Linq2Sql? - PullRequest
2 голосов
/ 11 сентября 2009

Я часто беру классы, которые генерирует linq2sql, и создаю простой класс только для данных, например

public class myentity
{
     public Guid id { get; set; }
     public string name { get; set; }
     // etc
}

Я не помещаю методы в эти классы и в основном использую их как вспомогательные классы, поэтому я могу довольно легко сериализовать в / из json и другие подобные действия.

Мой вопрос, должен ли я использовать структуру в этом случае, а не класс?

Кажется, имеет смысл сделать ее структурой, поскольку она более или менее является определением структуры, но я не знаю, будет ли производительность здесь идеальной, поскольку я часто передаю классы от метода к методу, и я не не нужно тонны копий, поскольку структуры являются типами значений.

Другая вещь, которую я делаю довольно часто, - это использование отложенного выполнения Linq2Sql для возврата моей собственной облегченной версии классов Linq2Sql, а не той, которую они генерируют. Я не совсем уверен, что использование структуры вместо класса могло бы оказать здесь негативное влияние на производительность.

пример того, как я бы использовал отложенное выполнение, выглядит примерно так

public IEnumerable<myentity> getEntities()
{
     return from me in MyEntity return new myentity() { id = me.id, name = me.name };
}

public IEnumerable<myentity> getEntitiesThatStartWith(string s)
{
     return from me in getEntities() where me.name.StartsWith(s);
}

Ответы [ 2 ]

7 голосов
/ 11 сентября 2009

Я бы пошел с class. Изменчивый struct редко бывает хорошим. Если вы не видите явного преимущества использования структур вместо классов, вам следует избегать этого.

В частности, в вашем случае использование struct усложняет метод для изменения содержимого экземпляра (например, десериализация из JSON и заполнение некоторых свойств; вам придется использовать ref все время).

Предположим, Entity является структурой:

List<Entity> entities = ...;
entities[0].Name = "Test"; // won't compile.
5 голосов
/ 11 сентября 2009

Я думаю, вы неправильно поняли суть структур. Вы говорите «это более или менее определение структуры», но вы не упомянули семантику типа значения (копирование) один раз - и это определение структуры IMO Неважно, сколько существует методов и т. Д., Речь идет о семантике значения или ссылочного типа.

Как говорит Мердад, изменяемые структуры редко бывают полезными. Я бы сказал более решительно: они почти всегда злые и будут вызывать странные ошибки, которые очень сложно диагностировать. Просто скажите «нет» - по моему опыту, очень редко это правильный выбор. Они предназначены для основных типов данных, таких как числа, даты, символы, перечисления и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...