Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/34: Рейтинг темы: голосов - 34, средняя оценка - 4.91
 Аватар для BadCats
2 / 2 / 1
Регистрация: 31.01.2016
Сообщений: 119

Псевдонимы(алиасы) в перечисления - правила использования

17.02.2016, 20:58. Показов 7059. Ответов 16
Метки нет (Все метки)

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

(byte, sbyte, short, ushort, int, uint, long, ulong) , но нельзя

использовать любой системный целый тип данных C# (Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64) ?

Когда я смотрел видео урок, то там был такой пример-объяснение: "Представте себе ситуацию в которой возможно, Вы захотите отказаться от Framework-ов предоставляемых Microsoft в языке c# и отключите импорт всех библиотек и в том числе импорт библиотеки System, и решите создавать свои типы. Вы ведь можете создавать свои типы? Конечно же да, но при этом у вас должны остаться простейшие типы данных. Так вот, простейшие типы даннных(даже при отключенной библиотеке System) у вас все же останутся, но в виде алиасов, а не в виде полноценной структуры (например byte) которая входит в пространство имен System. ". Почему при таком подробном описании ситуации я это все спрашиваю? Дело в том, что далее по уроку автор уделил теме алиасов еще некоторое время (а сам автор страдает забывчивостью сказать что то важное и иногда к сожалению обладает некоторой степенью недосказанности по некоторым вопросам)

Вот в чем мой вопрос: Есть ли еще причины (помимо вышеприведенного примера) почему в перечислениях используют алиасы(псевдонимы)?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.02.2016, 20:58
Ответы с готовыми решениями:

Правила использования операций
1)Дан код int x, i.Чему равен результат выражения *(x+i) == x 2)Дан код int *p. Можно ли записать следующий оператор: p = p + 5? 3)...

Правила использования ExtractFileFromCab
Функция ExtractFileFromCab предназначена для извлечения файлов из архивов CAB. Может, кто знает правила ее использования? Подскажите...

Особенности использования правила float
Заметил такую особенность. Есть картинка есть абзац с текстом, задаешь картине обтекание абзац обтекает. И есть два блока они начнут...

16
Эксперт .NET
 Аватар для Rius
13023 / 7588 / 1661
Регистрация: 25.05.2015
Сообщений: 23,072
Записей в блоге: 14
17.02.2016, 21:48
Баг такой был, говорят. И есть до сих пор, потому что толку от его исправления нет.
Posted by Microsoft on 6/25/2010 at 8:53 AM Thanks for the suggestion for Visual Studio!

As you point out, we could enable support for saying Int16 instead of int here, but this would not provide any extra expressiveness to C# programs (and it's more characters to type!). We'd be unlikely to invest our resources to add this support to Enums.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18240 / 14154 / 5366
Регистрация: 17.03.2014
Сообщений: 28,841
Записей в блоге: 1
18.02.2016, 01:29
Лучший ответ Сообщение было отмечено BadCats как решение

Решение

BadCats, если я правильно понимаю тебя интересует почему можно написать enum Smth : int { ... }, но нельзя написать enum Smth : Int32 { ... }. Если разрешить второй вариант, то можно будет написать такой код, который компилятору придется проверять.
C#
1
2
3
4
5
6
7
8
9
struct Int32
{
    // ...
}
 
enum Smth : Int32
{
    A, B, C
}
При компиляции такого кода компилятору придется убедиться что Int32 это System.Int32, а не что-то другое. Чтобю упростить жизнь и программисту и кмпилятору проще разрешить "наследование" только от встроенных типов. Спенарий с заменой базовой библиотеки тоже стоит учитывать, но он все таки может встретиться гораздо реже чем попытка указать неправильный типы для enum.
2
Эксперт .NET
 Аватар для Rius
13023 / 7588 / 1661
Регистрация: 25.05.2015
Сообщений: 23,072
Записей в блоге: 14
18.02.2016, 08:33
Лучший ответ Сообщение было отмечено BadCats как решение

Решение

Жизнь они упростили только компилятору Программисты же ломают головы, изыскивая в запрете Int32 и разрешении int тайный смысл.
Это всё равно не наследование. Код с типами и их алиасами компилируется из
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public enum Enum1 : short
{
    One,
    Two
}
 
public enum Enum2 : uint
{
    One,
    Two
}
 
struct Str1
{
    uint value1;
    System.UInt32 value2;
    short value3;
    System.Int16 value4;
}
в такой IL
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.class public auto ansi sealed Enum1
    extends [mscorlib]System.Enum
{
    // Fields
    .field public specialname rtspecialname int16 value__
    .field public static literal valuetype Enum1 One = int16(0)
    .field public static literal valuetype Enum1 Two = int16(1)
 
} // end of class Enum1
 
.class public auto ansi sealed Enum2
    extends [mscorlib]System.Enum
{
    // Fields
    .field public specialname rtspecialname uint32 value__
    .field public static literal valuetype Enum2 One = uint32(0)
    .field public static literal valuetype Enum2 Two = uint32(1)
 
} // end of class Enum2
 
.class private sequential ansi sealed beforefieldinit Str1
    extends [mscorlib]System.ValueType
{
    // Fields
    .field private uint32 value1
    .field private uint32 value2
    .field private int16 value3
    .field private int16 value4
 
} // end of class Str1
Т.е. компилятор и о заменяемости uint <> System.UInt32 знает, и enum на самом деле наследует от System.Enum.
А якобы переносимость без стандартных типов будет какая-то теоретическая, сферическая и в вакууме. Вроде бы и можно её сделать, но никому нафиг не надо.
1
 Аватар для BadCats
2 / 2 / 1
Регистрация: 31.01.2016
Сообщений: 119
18.02.2016, 20:22  [ТС]
т.е, когда я использую алиасы в перечислениях, то теоретически работа компилятора будет идти быстрее т.к компилятору не придется проверять что Int32 это System.Int32 или я ошибаюсь?
0
Эксперт .NET
 Аватар для Rius
13023 / 7588 / 1661
Регистрация: 25.05.2015
Сообщений: 23,072
Записей в блоге: 14
18.02.2016, 20:23
Лучший ответ Сообщение было отмечено BadCats как решение

Решение

BadCats, о скорости Вам беспокоиться не стоит.
У них баг. Баг всех устраивает. Всё нормально. Улыбаемся и машем.
1
 Аватар для BadCats
2 / 2 / 1
Регистрация: 31.01.2016
Сообщений: 119
22.02.2016, 20:39  [ТС]
можно ссылку на источник?
0
Эксперт .NET
 Аватар для Rius
13023 / 7588 / 1661
Регистрация: 25.05.2015
Сообщений: 23,072
Записей в блоге: 14
22.02.2016, 20:51
https://connect.microsoft.com/... stem-int64
https://connect.microsoft.com/... -type-name
- эти ссылки уже не работают, за что спасибо MS. Может быть в архиве каком-нибудь найдёте.

http://stackoverflow.com/quest... on-to-long

https://social.msdn.microsoft.... rplanguage - здесь закончилось призывом модератора принять всё как есть и верить MS святоликому. Меня, впрочем, не убедило.
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
22.02.2016, 20:53
BadCats, ошибаешься, компилятор всегда работает с полными именами.
0
 Аватар для BadCats
2 / 2 / 1
Регистрация: 31.01.2016
Сообщений: 119
22.02.2016, 20:54  [ТС]
простите не понял. Можно пожалуйста подробнее?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
22.02.2016, 21:53
BadCats, int == Int32 == System.Int32. Сокращенные записи существуют только для программиста.

Добавлено через 28 минут
BadCats, кстати var туда же. Компилятор и так и так выводит тип, поэтому если кто думает, что не используя var упрощает задачу компилятору - то он сильно ошибается. Или не использует юзинги - что с ними, что без них, скорость будет одна и та же. Причем для компилятора все типы характеризуются просто числом - уникальным идентификатором. Если точнее - адресом VTable в памяти И вот с этим числом работает компилятор. А все эти строки существуют только для работы с ними людей.
2
 Аватар для BadCats
2 / 2 / 1
Регистрация: 31.01.2016
Сообщений: 119
23.02.2016, 13:11  [ТС]
нашел! на archive.org Это оно?
https://web.archive.org/web/20... stem-int64
0
Эксперт .NET
 Аватар для Rius
13023 / 7588 / 1661
Регистрация: 25.05.2015
Сообщений: 23,072
Записей в блоге: 14
23.02.2016, 13:47
Да, оно.
Как видите, "by design" и "won't fix".

Добавлено через 12 минут
As you point out, we could enable support for saying Int16 instead of int here, but this would not provide any extra expressiveness to C# programs (and it's more characters to type!). We'd be unlikely to invest our resources to add this support to Enums.

Alex Turner
Program Manager
Visual Basic and C# Compiler
Т.е. могли бы исправить, но профита нет от этого, так что тратить время на исправление не хотят. Это ответ на вопрос темы. Нет никакого тайного смысла, мирового заговора и расчёта на портирование языка. Всё банально.
1
 Аватар для BadCats
2 / 2 / 1
Регистрация: 31.01.2016
Сообщений: 119
07.03.2016, 16:40  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
https://social.msdn.microsoft.com/Fo...csharplanguage - здесь закончилось призывом модератора принять всё как есть и верить MS святоликому. Меня, впрочем, не убедило.
Привет Ruis, переводил данную тобой тему на "Великий и могучий", и хотелось бы узнаттьь твое мнение по поводу данного высказывания:
Well, technically speaking System.Int16 is a value type ﴾structure﴿ which has one 'short' field. You cannot use
value type as enum underlying type ‐ IMO that's why you get the error.
This is definitely the reason why you cannot do this in IL language.
However I can imagine that a .NET language could choose to hide this technical difference from developer in
that language. C# didn't choose to hide it in this case. If you want to know why, I'd recommend to ask on
C# language forum.
‐Karel
ответ:
"short" and "System.Int16" are one and the same.
They are both value types ‐ "short" is just an alias for the System.Int16 value type.
I'm not sure what you mean when you say that System.Int16 has one 'short' field ‐ it doesn't ‐ it has the
same members and fields as 'short' since it's the same type.
ответ на ответ:
You are right that C# considers 'short' as alias for 'System.Int16' ﴾as this MSDN doc mentions﴿. Therefore
this particular question should be probably raised on C# forum.
I interpreted 'short' as equivalent to 'signed 16‐bit integer' which is named 'int16' in IL/CLI, where it is
indeed different: int16 and System.Int16 are tight together, but technically they are not the same in CLI.
int16 corresponds to the unboxed value type System.Int16.
Note that System.Int16 cannot be used at many places where int16 ﴾ELEMENT_TYPE_I2﴿ can be used ﴾e.g. in
signatures and custom attributes encoding﴿.
On the other hand int16 ﴾ELEMENT_TYPE_I2﴿ cannot be used for method calls, because it is not a BCL type.
That's where System.Int16 comes handy.
You can also confirm that by running ildasm.exe on mscorlib.dll. Here's how System.Int16 is defined:
Code
1
2
3
4
5
6
7
8
9
10
11
.class public sequential ansi serializable sealed beforefieldinit System.Int16
extends System.ValueType
implements System.IComparable,
System.IFormattable,
System.IConvertible,
class System.IComparable`1<int16>,
class System.IEquatable`1<int16>
{
.field assembly int16 m_value // Note: This is not recursive definition
// And more ...
}
Sorry for the confusion,
‐Karel
Мне нужно твое мнение по поводу этих цитат. Всем Заранее Спасибо!
все остальные кстати тоже могу высказываться
мне необходимо узнать: есть ли крупица смысла(смысла про то, что в IL коде это все же разные типы) в этих цитатах-предположениях или это просто бред?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
07.03.2016, 18:10
BadCats, ну почему, человека понять можно. Он говорит о том, что для программиста short и Int16 это один и тот же тип, но для рантайма это разные вещи. Из шарпа ты отличий никогда не увидишь, потому что на уровне языка это опять же одно и то же (примитивное typeof(short) == typeof(Int16) это подтвердит), а вот на нижележащих уровнях это разные вещи, потому что Int16 - это структура, в которую упаковывается "настоящее" число при боксинге, а при анбоксинге соответственно оно достается. Соответственно т.к. вызовы методов (по крайней мере через интерфейс) без боксинга невозможны, то и вызывать их можно только на "взрослой" структуре. Про случаи, когда можно использовать только число, но нельзя структуру немного не понял - слишком низкоуровневые вещи затронуты.
0
 Аватар для BadCats
2 / 2 / 1
Регистрация: 31.01.2016
Сообщений: 119
07.03.2016, 21:35  [ТС]
Может я сейчас напишу ОЧЕНЬ БОЛЬШУЮ ГЛУПОСТЬ, но каким боком это к несовместимости (в версии C# младше 6.0) алиасов и "полноценных типов" в перичеслениях? Короче вопрос всей этой темы, приминительно к этим ответам на иностранном MSDN
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,569
04.06.2016, 23:43
Судя по всему данное ограничение было убрано в C# 6.0: источник.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.06.2016, 23:43
Помогаю со студенческими работами здесь

Пределы без использования правила Лопиталя
lim x-&gt;0 ((1+tgx)^1/2 - (1+sinx)^1/2) / x^3 lim h-&gt;0 (0arctg(x+h)-arctgx)/h

Какие правила использования динамических массивов?
Каких правил мы придерживаемся при работе с динамическими массивами? Ответ в гугле я так и не нашел.

Правила использования строчных и блочных элементов
Доброго времени. Появился такой вот скользкий вопрос. Не секрет, что блочный элемент нельзя сунуть внутрь строчного. Тоесть нельзя...

Правила использования внешнего жесткого диска
Здравствуйте. Купил внешний жестки диск : http://hard.rozetka.com.ua/ru/products/ ... index.html В этот жестком диске отдельный USB...

Посчитать предел, без использования правила Лопиталя
\lim_{x-&gt;1}{x}^{(tg(pi*x/2))} Что я пытаюсь сделать: \lim_{x-&gt;1}{x}^{(tg(pi*x/2))} = замена x=1-y = ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru