Как создать свой тип данных в c

от admin

C# создание своего типа данных

Мне нужен свой тип данных, размер которого будет очень мал — 4 бит. Как это реализовать? Нужно это для более компактного хранения в памяти и на HDD чисел от 0 до 31. Использовать, например, Byte, чтобы в его двоичном коде хранить 2 моих переменных не вариант, т.к. мне нужны массивы с 4ех байтным типом данных

Для хранения чисел от 0 до 31 вам нужно 5 бит. Хранить можно в BitArray (но по факту, будет выделено все равно 1 байт):

Увы, вы не сможете создать тип, который будет занимать меньше 1 байта.

По поводу вашего вопроса, меня он тоже заинтересовал, конечно все упирается в минимальное значение CLR (byte) — там еще просто стандарт SizeOf (какой-то там ISO). Но мне почему-то стало интересно, ведь есть тип данных bool, который в свою очередь просто триггер (0/1). Который по смыслу должен занимать именно 1 бит. Окей, он приводиться к byte пускай, это приведение примерно так выглядит — true = 0xFF, false = 0x0 — тут тоже действует какой-то там стандарт. Но самое интересно как оказывается начинается, с момента компиляции и интересных аттрибутов для структуры.

В свою очередь я смог нагуглить интересную статью, которая дает намного больше информации по данной теме: https://habr.com/ru/post/114953/ Так как мои знания и мое осознание данной проблемы, немного не литературным языком сформированы, то и галантно описать я не могу (почитайте статью). Ко всему прочему, еще на cyberforum’e (http://www.cyberforum.ru/csharp-net/thread341534.html), есть интересный эксперимент-обсуждение по этому поводу.

На основе этого примера верните нужную вам часть масива (Хоть половину значения)

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.3.11.43304

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Как создать свой тип данных в c

Наряду с классами структуры представляют еще один способ создания собственных типов данных в C#. Более того многие примитивные типы, например, int, double и т.д., по сути являются структурами.

Определение структуры

Для определения структуры применяется ключевое слово struct :

После слова struct идет название структуры и далее в фигурных скобках размещаются элементы структуры — поля, методы и т.д.

Например, определим структуру, которая будет называться Person и которая будет представлять человека:

Как и классы, структуры могут хранить состояние в виде полей (переменных) и определять поведение в виде методов. Например, добавим в структуру Person пару полей и метод:

В данном случае определены две переменные — name и age для хранения соответственно имени и возраста человека и метод Print для вывода информации о человеке на консоль.

И как и в случае с классами, для обращения к функциональности структуры — полям, методам и другим компонентам структуры применяется точечная нотация — после объекта структуры ставится точка, а затем указывается компонент структуры:

Создание объекта структуры

Инициализация с помощью конструктора

Для использования структуры ее необходмо инициализировать. Для инициализации создания объектов структуры, как и в случае с классами, применяется вызов конструктура с оператором new . Даже если в коде стуктуры не определено ни одного конструктора, тем не менее имеет как минимум один конструктор — конструктор по умолчанию, который генерируется компилятором. Этот конструктор не принимает параметров и создает объект структуры со значениями по умолчанию.

Например, создадим объект структуры Person с помощью конструктора по умолчанию:

В данном случае создается объект tom. Для его создания вызывается конструктор по умолчанию, который устанавливает значения по умолчанию для его полей. Для числовых данных это значение 0, поэтому поле age будет иметь значение 0. Для строк это значение null , которое указывает на отсутствие значения. Но далее, если поля доступны (а в данном случае поскольку они имеют модификатор public они доступны), мы можем изменить их значения. Так, здесь полю name присваивается строка «Tom». Соответственно при выполнении метода Print() мы получим следующий консольный вывод:

Непосредственная иницилизация полей

Если все поля структуры доступны (как в случае с полями структуры Person, который имеют модификатор public ), то структуру можно инициализировать без вызова конструктора. В этом случае необходимо присвоить значения всем полям структуры перед получением значений полей и обращением к методам структуры. Например:

Инициализация полей по умолчанию

Стоит отметить, что начиная с версии C# 10, мы можем напрямую инициализировать поля структуры при их определении (до C# 10 это делать было нельзя):

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

Конструкторы структуры

Как и класс, структура может определять конструкторы. Например, добавим в структуру Person конструктор:

В данном случае в структуре Person определен конструктор с двумя параметрами, для которых предоставлены значения по умолчания. Однако обратите внимание на создание первого объекта структуры:

Здесь по-прежнему применяется конструктор по умолчанию, тогда как при инициализации остальных двух переменных структуры применяется явно определенный конструктор.

Однако начиная с версии C# 10 мы можем определить свой конструктор без параметров:

Стоит отметить, что до версии C# 11 при определении конструктора структуру в нем необходимо было инициализировать все поля структуры, начиная с версии C# 11 это делать необязательно.

В случае если нам необходимо вызывать конструкторы с различным количеством параметров, то мы можем, как и в случае с классами, вызывать их по цепочке:

Консольный вывод программы:

Инициализатор структуры

Также, как и для класса, можно использовать инициализатор для создания структуры:

При использовании инициализатора сначала вызывается конструктор без параметров: если мы явным образом не определили конструктор без параметров, то вызывается конструктор по умолчанию. А затем его полям присваиваются соответствующие значения.

Копирование структуры с помощью with

Если нам необходимо скопировать в один объект структуры значения из другого с небольшими изменениями, то мы можем использовать оператор with :

В данном случае объект bob получает все значения объекта tom, а затем после оператора with в фигурных скобках указывается поля со значениями, которые мы хотим изменить.

5.2. Пользовательские типы данных.

Типы данных, определяемые пользователем, являются важнейшим инструментом в современном программировании. Стандартные (встроенные) типы, такие как int, char, double и т.д. являются примитивными, поскольку оперируют с числами и символами, в то время как существующие структуры данных намного сложнее.

Вторая причина, из-за которой следует переходить к пользовательским типам данных, заключается в том, что стандартные типы не информативны, т.е. «int a» может означать целое число студентов, координату пиксела, номер открытого файла. Несмотря на то, что все эти понятия имеют характер целых чисел, их желательно не смешивать, используя один тип.

5.2.1. Ключевое слово typedef

Ключевое слово typedef используется для присвоения нового имени существующему типу. Допустим, утомительно писать в программе объявления с unsigned int, например:

Читать:
Как заменить все буквы в тексте на другую ворд

Присвоим unsigned int новое обозначение с помощью typedef

typedef unsigned int UI;

Кроме задания типов с длинными описаниями более коротких псевдонимов, typedef используется для облегчения переносимости программ. Если машинно-зависимые типы объявить с помощью typedef, при переносе этих программ потребуется внести изменение только в эти операторы.

5.2.2. Перечислимый тип данных

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

При выполнении арифметических операций перечисления преобразуются в целые.

5.2.3. Понятие структуры

Структура – это набор из одной или более переменных, возможно, различных типов, сгруппированных под одним именем для удобства обработки.

В отличие от массива, который является однородным объектом, структура может быть неоднородной. Традиционным примером структуры является учетная карточка работника: “служащий“ описывается набором атрибутов, таких как фамилия, имя, отчество, адрес, код социального обеспечения, зарплата и т.д. Некоторые из этих атрибутов сами могут оказаться структурами, например адрес.

Структуры оказываются полезными при организации сложных данных, особенно в больших программах, поскольку во многих ситуациях они позволяют сгруппировать связанные данные таким образом, что с ними можно обращаться как с одним целым, а не как с отдельными объектами. Ключевое слово struct сообщает компилятору, что объявляется именно структура. Тип структуры определяется записью, как показано далее.

struct addr

список определений;

В приведенном ниже примере идентификатор student описывается, как структура:

Описание структуры, за которым не следует списка переменных, не приводит к выделению какой-либо памяти; оно только определяет шаблон или форму структуры.

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

Структуры могут быть вложенными, например учетная карточка служащего может фактически выглядеть так:

Как добавить свой собственный тип данных в программу на С#?

Подобно тому, как «int» относится к классу «Int32», «string» относится к классу «String». Как передать тип данных, например «abc», в мой класс «Abc»?

задан 19 июля ’10, 07:07

зачем тебе вообще это делать? — Mitch Wheat

@Mitch Wheat — может быть, в VS будет синий шрифт;) — prostynick

чтобы сделать тип данных, который доступен для других программистов, использовал мой класс. — chanchal1987

Дайте вашему классу правильное имя для начала. Класс ЯВЛЯЕТСЯ типом данных! — Mitch Wheat

Как это получает так много голосов и фаворитов? Это не имеет смысла. — cjk

7 ответы

Ваш «класс» — это тип данных.

Примеры, которые вы приводите, представляют собой разницу между именами типов данных CLR и именами типов данных C#. Они псевдонимы. C# int сопоставляется с CLR Int32, а строка C# сопоставляется со строкой CLR.

Вы можете создавать свои собственные псевдонимы, используя «using Xyx=Abc». Вы должны сделать это в каждом исходном файле, так что это не очень полезно.

Создан 19 июля ’10, 11:07

Я думаю, что мне следовало использовать здесь CTS, а не CLR. Виноват. — Филип Смит

Но визуальная студия определяет мой класс как «класс» и окрашивается как класс. Но типы данных окрашены по-разному в Visual Studio. — Шанчал1987

Неправильно. Все классы являются типами данных. VS выделяет зарезервированные слова C# темно-синим цветом, а все остальные типы данных — бледно-голубым. Темно-синяя подсветка не имеет ничего общего с разницей между классами и типами. — Филип Смит

Вы можете добавить псевдоним следующим образом:

Но я бы спросил, почему вы хотите это сделать.

[Другой постер указал на правильное использование, а именно конфликты типов пространств имен, но тогда я всегда использовал бы полное имя типа, иначе это могло бы сильно запутать.]

Создан 19 июля ’10, 12:07

Жутко. Я даже использовал одно и то же имя пространства имен — флетчер

@fletcher: да, это жутко! Тем более, что я бы никогда этого не сделал! ржунимагу! — Митч Уит

Предположим, я хочу передать свой класс другим программистам. Если я сделаю свой класс типом данных, они смогут легко понять и использовать его как простой тип данных. Спасибо за Ваш ответ. — Шанчал1987

Как указал Филип Смит, ваш пользовательский класс является типом данных, и его члены становятся доступными через этот контекст. — Харрыв

давно, но ответ «ПОЧЕМУ» таков: глобально определить тип данных, например C для быстрой смены типа. например: DBKey = System.UInt32 or DBKey = System.UInt64 . или же DBKey=System.Int32 — Raiserle

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

Создан 19 июля ’10, 11:07

Вы совершенно не понимаете, что такое «тип данных». В C# такие ключевые слова, как int , string, и т. д. являются просто псевдонимами для соответствующих типов (реализованных как классы/структуры), уже присутствующих в CLR. Например, int имеет точно такое же значение, как System.Int32 , которая является структурой, определяемой ядром платформы .NET. Сходным образом, string просто означает System.String , который является классом.

В .NET каждую «тип данных» в конечном итоге наследуется от System.Object (который имеет псевдоним object в С#). Типы данных, на которые вы ссылаетесь, — это просто предварительно реализованные классы и структуры, которые наследуются от System.Object ; в них нет ничего особенного. Вы должны понимать, что в C# нет специальных примитивных типов, как в других языках: все они являются частью общей иерархии типов. Ключевые слова, к которым вы привыкли, просто предоставлены для удобства.

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

Создан 19 июля ’10, 12:07

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

Создан 19 июля ’10, 11:07

Функция, которую вы ищете, вероятно, является чем-то, к чему вы привыкли в C++. В C# нет эквивалентной концепции. Все, что у вас есть, это встроенный тип данных. Единственное, что вы можете объявить, это ваш собственный класс или структуру, но не тип данных.

Создан 19 июля ’10, 12:07

нет способа определить пользовательские типы данных в С#, у меня та же проблема, и я безуспешно искал решение, в моем случае мне нужно определить тип данных для неуправляемых типов, таких как MarshalAs(UnmanagedType.LPWStr)]

ответ дан 01 дек ’18, 05:12

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками c# types or задайте свой вопрос.

Похожие статьи