Ответ 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 решили, что было бы целесообразно назначить его как таковое, было бы интересно определить, почему они это сделали: -)