Какая польза от типов значений в .Net?

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
1 248
8

Ответы 8

Enums - первоклассные граждане мира .NET. Что касается структур, я обнаружил, что в большинстве случаев можно использовать классы, однако для сценариев с интенсивным использованием памяти рассмотрите возможность использования структур. В качестве практического примера я использовал структуры как структуры данных для примитивов протоколов OSCAR (ICQ).

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

т.е.

enum MyWeirdType {
TypeA, TypeB, TypeC};

switch(value){
case MyWeirdType.TypeA:
...

Au Contrare ... вы обнаружите, что люди C / C++ стекаются к структурам, также известным как типы значений. Примером могут быть пакеты данных. Если у вас есть большое количество пакетов данных для передачи / передачи, вы должны использовать структуры значений для моделирования своих пакетов данных. причина: преобразование чего-либо в класс добавляет накладные расходы (примерно 8-16 байт, я забыл) накладные расходы в заголовке объекта в дополнение к данным экземпляра. В сценариях, где это неприемлемо, наиболее безопасным вариантом являются типы значений. Другой вариант использования - это ситуации, когда вам понадобится семантика типа значения - как только вы создадите-инициализируете объект, он будет доступен только для чтения / неизменяем и может быть передан n клиентам.

Вы должны использовать тип значения всякий раз, когда:

  • Использование класса не обязательно (нет необходимости в наследовании)
  • Вы хотите убедиться, что нет необходимости инициализировать тип.
  • У вас есть причина, по которой тип должен быть размещен в пространстве стека.
  • Вы хотите, чтобы тип был полностью независимой сущностью по назначению, а не «ссылкой» на экземпляр, как в ссылочных типах.

Могу добавить: когда вам не нужна личность для вашей сущности. Например, двухмерная точка или так далее.

Andrei Rînea 08.10.2008 16:51

Как раз то, для чего их используют большинство других людей .. Быстрый и легкий доступ к данным / значениям. А также идеально подходит для группирования свойств (где, конечно, имеет смысл) в объект.

Например:

  • Различия в отображаемых / данных значениях, например строковые пары имен изображений и путь к элементу управления (или что-то еще). Вам нужен путь для работы под капотом, но имя должно быть видно пользователю.
  • Очевидная группировка значений метрики объектов. Все мы знаем размер и т. д., Но может быть множество ситуаций, когда вам недостаточно базовых «метрических» типов.
  • «Типизация» значений перечисления - это больше, чем фиксированное перечисление, но меньше, чем полноценный класс (уже упоминалось, просто хочу отстаивать).

Важно помнить о различия между типами значений и ссылочными типами. При правильном использовании они действительно могут повысить эффективность вашего кода, а также сделать объектную модель более устойчивой.

Типы значений, в частности структуры и перечисления, имеют правильное применение в объектно-ориентированном программировании.

Как сказал 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 и т. д.

В случае сомнений используйте вместо этого ссылочный тип.

Другие вопросы по теме