Официальные рекомендации предполагают, что для них может быть очень мало практических применений. Есть ли у кого-нибудь примеры того, где они хорошо их использовали?
Какое использование типов значений в .Net?
Ответ 1
Au Contrare... вы обнаружите, что люди C/С++ стекаются в типы значений a.k.a. structs.
Примером может служить пакет данных. Если у вас есть большое количество пакетов данных для передачи/передачи, вы должны использовать конструкторы значений для моделирования ваших пакетов данных.
Причина. Превращение чего-то в класс добавляет дополнительные (около 8-16 байтов, которые я забываю) из служебных данных в заголовке объекта в дополнение к данным экземпляра. В сценариях, где это неприемлемо, типы ценностей - ваша самая безопасная ставка
Другим вариантом использования будет ситуация, когда вам нужна тип семантики значения. Когда вы создаете-инициализируете объект, он является readonly/неизменным и может передаваться n клиентам.
Ответ 2
По большей части хорошо подражать поведению структуры. Многие типы элементарных данных, такие как int
, являются типами значений. Если у вас есть типы с аналогичными свойствами, используйте типы значений. Например, при написании типа данных Complex
или BigInteger
типы значений являются логическим решением. То же самое относится и к другим случаям, когда структура использует типы значений: DateTime
, Point
и т.д.
Если вы сомневаетесь, используйте ссылочный тип.
Ответ 3
Enums являются гражданами первого класса в мире .NET. Что касается структур, я обнаружил, что в большинстве случаев могут использоваться классы, однако для интенсивных сценариев памяти можно использовать структуры. В качестве практического примера я использовал структуры в качестве структур данных для примитивов протоколов OSCAR (ICQ).
Ответ 4
Я предпочитаю использовать перечисление для исключения магических чисел, это может быть преодолено константой, я думаю, но перечисление позволяет группировать их.
то есть
enum MyWeirdType {
TypeA, TypeB, TypeC};
switch(value){
case MyWeirdType.TypeA:
...
Ответ 5
Вы должны использовать тип значения, когда:
- Использование класса не требуется (нет необходимости в наследовании)
- Вы хотите убедиться, что нет необходимости инициализировать тип.
- У вас есть причина, чтобы тип был выделен в пространстве стека.
- Вы хотите, чтобы тип был полностью независимым сущностью при присваивании вместо "ссылки" на экземпляр, так как он находится в ссылочных типах.
Ответ 6
Именно то, что используют большинство других людей для... Быстрый и легкий доступ к данным/стоимости. А также идеально подходит для создания свойств группировки (где это естественно) в объект.
Например:
- Различия в значениях отображения/данных, такие как пары строк имен изображений и путь для элемента управления (или что-то еще). Вам нужен путь для работы под капотом, но имя должно быть видимым для пользователя.
- Очевидная группировка значений для метрик объектов. Мы все знаем размер и т.д., Но может быть много ситуаций, когда базовых "метрических" типов недостаточно для вас.
- "Enter" значений перечисления, являющийся более чем фиксированным перечислением, но тем более, что полный раздутый класс (уже упоминался, просто хочет защищать).
Важно помнить различия между значениями и типами ссылок. Используемые правильно, они могут действительно повысить эффективность вашего кода, а также сделать объектную модель более надежной.
Ответ 7
Типы значений, в частности, структуры и перечисления, и имеют правильное использование в объектно-ориентированном программировании.
Перечисления, как сказал aku, являются гражданами первого класса в .NET, которые могут использоваться из разных видов: от цветов до диалогов до различных типов флагов.
Структуры, насколько мне известно, являются прекрасными объектами передачи данных; логические контейнеры данных, особенно когда они состоят в основном из примитивных типов.
И, конечно же, примитивные типы - это все типы значений, которые разрешают System.Object(в отличие от Java, где примитивные типы не связаны с структурами и нуждаются в какой-то оболочке).
Ответ 8
Фактически до .net 3.5 SP1 возникла проблема с интенсивным использованием типов значений, как указано здесь, в блог Vance Morrison.
Насколько я вижу, в большинстве случаев вы должны использовать классы, а JITTER должен гарантировать хороший уровень производительности.
structs имеет "семантику типа значения", поэтому будет передаваться по значению, а не по ссылке. Мы можем видеть это различие в поведении в следующем примере: -
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 и когда она изменит a.Foobar изменит Foobar своего нового типа. ClassTest() получит ссылку на b и, следовательно, будет изменено свойство .Foobar для b. Таким образом, мы получим следующий результат: -
a.Foobar=hi, b.Foobar=hello
Итак, если вы хотите семантику типа значения, это будет другой причиной, чтобы объявить что-то как структуру. Обратите внимание, что тип DateTime в .net - это тип значения, поэтому архитекторы .net решили, что было бы целесообразно назначить его как таковое, было бы интересно определить, почему они это сделали: -)