официальные инструкции предполагает, что для них может быть очень мало практических применений. Есть ли у кого-нибудь примеры того, как они нашли им хорошее применение?





Enums - первоклассные граждане мира .NET. Что касается структур, я обнаружил, что в большинстве случаев можно использовать классы, однако для сценариев с интенсивным использованием памяти рассмотрите возможность использования структур. В качестве практического примера я использовал структуры как структуры данных для примитивов протоколов OSCAR (ICQ).
Я обычно использую enum, чтобы избежать магических чисел, я думаю, это можно преодолеть с помощью const, но enum позволяет вам сгруппировать их.
т.е.
enum MyWeirdType {
TypeA, TypeB, TypeC};
switch(value){
case MyWeirdType.TypeA:
...
Au Contrare ... вы обнаружите, что люди C / C++ стекаются к структурам, также известным как типы значений. Примером могут быть пакеты данных. Если у вас есть большое количество пакетов данных для передачи / передачи, вы должны использовать структуры значений для моделирования своих пакетов данных. причина: преобразование чего-либо в класс добавляет накладные расходы (примерно 8-16 байт, я забыл) накладные расходы в заголовке объекта в дополнение к данным экземпляра. В сценариях, где это неприемлемо, наиболее безопасным вариантом являются типы значений. Другой вариант использования - это ситуации, когда вам понадобится семантика типа значения - как только вы создадите-инициализируете объект, он будет доступен только для чтения / неизменяем и может быть передан n клиентам.
Вы должны использовать тип значения всякий раз, когда:
Как раз то, для чего их используют большинство других людей .. Быстрый и легкий доступ к данным / значениям. А также идеально подходит для группирования свойств (где, конечно, имеет смысл) в объект.
Например:
Важно помнить о различия между типами значений и ссылочными типами. При правильном использовании они действительно могут повысить эффективность вашего кода, а также сделать объектную модель более устойчивой.
Типы значений, в частности структуры и перечисления, имеют правильное применение в объектно-ориентированном программировании.
Как сказал aku, перечисления - это первоклассные граждане .NET, которые могут использоваться из самых разных вещей, от цветов до опций DialogBox и до различных типов флагов.
По моему опыту, структуры хороши как объекты передачи данных; бессмысленные контейнеры данных, особенно когда они состоят в основном из примитивных типов.
И, конечно же, примитивные типы - это все типы значений, которые разрешаются в System.Object (в отличие от Java, где примитивные типы не связаны со структурами и нуждаются в какой-то оболочке).
Фактически, до .net 3.5 SP1 возникала проблема с производительностью из-за интенсивного использования типов значений, как упомянуто здесь, в Блог Вэнса Моррисона.
Насколько я понимаю, в подавляющем большинстве случаев вы должны использовать классы, и JITter должен гарантировать хороший уровень производительности.
Структуры имеют «семантику типа значения», поэтому передаются по значению, а не по ссылке. Мы можем увидеть эту разницу в поведении в следующем примере: -
using System;
namespace StructClassTest {
struct A {
public string Foobar { get; set; }
}
class B {
public string Foobar { get; set; }
}
class Program {
static void Main() {
A a = new A();
a.Foobar = "hi";
B b = new B();
b.Foobar = "hi";
StructTest(a);
ClassTest(b);
Console.WriteLine("a.Foobar = {0}, b.Foobar = {1}", a.Foobar, b.Foobar);
Console.ReadKey(true);
}
static void StructTest(A a) {
a.Foobar = "hello";
}
static void ClassTest(B b) {
b.Foobar = "hello";
}
}
}
Структура будет передана по значению, поэтому StructTest () получит свою собственную структуру A, и когда она изменится, Foobar изменит Foobar своего нового типа. ClassTest () получит ссылку на b и, таким образом, свойство .Foobar для b будет изменено. Таким образом, мы получили бы следующий результат: -
a.Foobar=hi, b.Foobar=hello
Так что, если вам нужна семантика типа значения, это будет еще одна причина объявить что-то как структуру. Интересно отметить, что тип DateTime в .net является типом значения, поэтому архитекторы .net решили, что было бы целесообразно назначить его как таковой, было бы интересно определить, почему они это сделали :-)
По большей части хорошо подражать поведению фреймворка. Многие элементарные типы данных, такие как int, являются типами значений. Если у вас есть типы со схожими свойствами, используйте типы значений. Например, при записи типа данных Complex или BigInteger типы значений являются логическим решением. То же самое и в других случаях, когда фреймворк использовал типы значений: DateTime, Point и т. д.
В случае сомнений используйте вместо этого ссылочный тип.
Могу добавить: когда вам не нужна личность для вашей сущности. Например, двухмерная точка или так далее.