Есть ли аналог typedef в C#?
От: csharpamateur  
Дата: 26.12.03 15:00
Оценка:
Часто хочется абстрагироваться от простых типов и дать им имя. Т.е. например не int id, а MessageId id.

В C++ это typedef int MessageId

В Pascal это MessageId = int

А как это сделать в C#?

Использовать using не получится, т.к. это имя должно быть видно за пределами namespace и assembly... Т.е. чтобы пользователь класса мог писать MessageId, а не int...
Re: Есть ли аналог typedef в C#?
От: Dr_Sh0ck Беларусь  
Дата: 26.12.03 15:03
Оценка:
Здравствуйте, csharpamateur, Вы писали:

C>А как это сделать в C#?


C>Использовать using не получится, т.к. это имя должно быть видно за пределами namespace и assembly... Т.е. чтобы пользователь класса мог писать MessageId, а не int...


через using можно назначить типу псевдоним
Do not fake yourself ;)
ICQ#: 198114726
Re[2]: using не подходит...
От: csharpamateur  
Дата: 26.12.03 15:11
Оценка:
Здравствуйте, Dr_Sh0ck, Вы писали:

D_S>Здравствуйте, csharpamateur, Вы писали:


C>>А как это сделать в C#?


C>>Использовать using не получится, т.к. это имя должно быть видно за пределами namespace и assembly... Т.е. чтобы пользователь класса мог писать MessageId, а не int...


D_S>через using можно назначить типу псевдоним


Псевдоним (alias) который назначается через using виден только внутри файла или namespace в котором он объявлен.
Re[3]: using не подходит...
От: Lloyd Россия  
Дата: 26.12.03 15:28
Оценка:
Здравствуйте, csharpamateur, Вы писали:

C>Псевдоним (alias) который назначается через using виден только внутри файла или namespace в котором он объявлен.


Как и сях, впрочем.
Другой вопрос, что там можно включать один файл в другой.
... << RSDN@Home 1.1.2 beta 1 >>
Re[4]: using не подходит...
От: csharpamateur  
Дата: 26.12.03 15:37
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, csharpamateur, Вы писали:


C>>Псевдоним (alias) который назначается через using виден только внутри файла или namespace в котором он объявлен.


L>Как и сях, впрочем.

L>Другой вопрос, что там можно включать один файл в другой.

Точнее typedef то и размещается в .h, который потом везде и включается. Но все таки, что же делать в C#? Ведь это же не дело, если клиент должен будет писать int MessageId, а потом все переписывать, если мы поменяем int на long...

Кстати, а как красиво в C# обойти отсутствие вложенных функций? Т.е. если какая-то функция достаточно длинная, на Pascal можно ее легко разбить на вложенные подфункции и не передавать вручную рабочие данные (это делается автоматически передачей неявной ссылки на стек-фрейм вызывающей фукнции).

Можно конечно делать вложенный класс и затем делать (new WorkerClass(param1,param2)).DoTheWork()
А может как-то еще?
Re[5]: using не подходит...
От: Lloyd Россия  
Дата: 26.12.03 15:51
Оценка:
Здравствуйте, csharpamateur, Вы писали:

L>>Как и сях, впрочем.

L>>Другой вопрос, что там можно включать один файл в другой.

C>Точнее typedef то и размещается в .h, который потом везде и включается. Но все таки, что же делать в C#? Ведь это же не дело, если клиент должен будет писать int MessageId, а потом все переписывать, если мы поменяем int на long...


C>Кстати, а как красиво в C# обойти отсутствие вложенных функций? Т.е. если какая-то функция достаточно длинная, на Pascal можно ее легко разбить на вложенные подфункции и не передавать вручную рабочие данные (это делается автоматически передачей неявной ссылки на стек-фрейм вызывающей фукнции).


Обычно таким массивные методы лучше выделить в отдельный класс. И проблема с передачей большого кол-ва параметров решится сама собой. Даже кажется есть какой-то патерн для этого дела.

C>Можно конечно делать вложенный класс и затем делать (new WorkerClass(param1,param2)).DoTheWork()


Это не поможет, т.к. стековые (локальные) переменные видны не будут.

C>А может как-то еще?
... << RSDN@Home 1.1.2 beta 1 >>
Re: Есть ли аналог typedef в C#?
От: WarlockOnLine Россия  
Дата: 26.12.03 17:24
Оценка: 7 (1)
Здравствуйте, csharpamateur, Вы писали:

C>Часто хочется абстрагироваться от простых типов и дать им имя. Т.е. например не int id, а MessageId id.


В C# несколько другая философия. Если тебе хочется именно этого, то объяви новый класс MessageId
И у MessageId можно реализовать implicit typecast к int
Re[6]: using не подходит...
От: csharpamateur  
Дата: 26.12.03 17:27
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Обычно таким массивные методы лучше выделить в отдельный класс. И проблема с передачей большого кол-ва параметров решится сама собой. Даже кажется есть какой-то патерн для этого дела.


C>>Можно конечно делать вложенный класс и затем делать (new WorkerClass(param1,param2)).DoTheWork()


L>Это не поможет, т.к. стековые (локальные) переменные видны не будут.


Собственно WorkerClass в данном случае и есть отдельный класс для метода, т.е. мы всю функцию переносим в DoTheWork
А подфункции вообще часто применяются без использования переменных вызывающей функции. Просто для того, чтобы сделать код легче и не забивать интерфейс класса не нужными функциями, которые выполняют промежуточную техническую работу.
Re[2]: Есть ли аналог typedef в C#?
От: csharpamateur  
Дата: 26.12.03 17:44
Оценка:
Здравствуйте, WarlockOnLine, Вы писали:

WOL>Здравствуйте, csharpamateur, Вы писали:


C>>Часто хочется абстрагироваться от простых типов и дать им имя. Т.е. например не int id, а MessageId id.


WOL>В C# несколько другая философия. Если тебе хочется именно этого, то объяви новый класс MessageId

WOL>И у MessageId можно реализовать implicit typecast к int

Интересный в принципе вариант. Можно делать struct'ы содержащие эти типы. Однако если для простых типов boxing случается не всегда, то для struct к примеру конструктор будет вызываться всегда и implicit преобразование — это тоже код который будет вызываться. Т.е. лишний оверхед на пустом месте.
Re[3]: Есть ли аналог typedef в C#?
От: WarlockOnLine Россия  
Дата: 26.12.03 18:06
Оценка:
Здравствуйте, csharpamateur, Вы писали:

C>Интересный в принципе вариант. Можно делать struct'ы содержащие эти типы. Однако если для простых типов boxing случается не всегда, то для struct к примеру конструктор будет вызываться всегда и implicit преобразование — это тоже код который будет вызываться. Т.е. лишний оверхед на пустом месте.

Можно попробовать изменить архитектуру приложения и совсем отказаться от int'овских MessageId'ов

Например, сделать класс и объявить там readonly свойство Id. Кто-то уже на форуме измерял производительность обращения к полю и к get-свойству, возвращающему поле: получилось примерно одинаково
Re[4]: Есть ли аналог typedef в C#?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 26.12.03 18:12
Оценка: +1
Здравствуйте, WarlockOnLine, Вы писали:


WOL>Например, сделать класс и объявить там readonly свойство Id. Кто-то уже на форуме измерял производительность обращения к полю и к get-свойству, возвращающему поле: получилось примерно одинаково

К сожалению get тормозят, правда совсем немного, но до инлайн не дотягивают.
И для ускорения правда на критичных алгоритмах простой инлайн дает 10-20% прирост скорости.
Для нормальных приложений это сущий пустяк, а для тестов и просто борьбы за скорость много.
и солнце б утром не вставало, когда бы не было меня
Re[4]: Есть ли аналог typedef в C#?
От: csharpamateur  
Дата: 26.12.03 18:41
Оценка:
WOL>Можно попробовать изменить архитектуру приложения и совсем отказаться от int'овских MessageId'ов

Но хотелось бы использовать к примеру FileSize вместо long...
Re[5]: Есть ли аналог typedef в C#?
От: WarlockOnLine Россия  
Дата: 26.12.03 18:57
Оценка:
Здравствуйте, csharpamateur, Вы писали:

C>Но хотелось бы использовать к примеру FileSize вместо long...

Зачем? Неужели для того, чтобы одним махом менять long на int? Такие типы я прошиваю в программах. В более сложных случаях, имхо следует использовать классы
Re[3]: Есть ли аналог typedef в C#?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 26.12.03 22:03
Оценка:
Здравствуйте, csharpamateur, Вы писали:

C>Однако если для простых типов boxing случается не всегда, то для struct к примеру конструктор будет вызываться всегда и implicit преобразование


Можно пример ситуации когда простой тип бокситься не будет, а структура будет?
... << RSDN@Home 1.1.2 beta 2 (mobile station) >>
AVK Blog
Re[4]: Есть ли аналог typedef в C#?
От: csharpamateur  
Дата: 27.12.03 02:11
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, csharpamateur, Вы писали:


C>>Однако если для простых типов boxing случается не всегда, то для struct к примеру конструктор будет вызываться всегда и implicit преобразование


AVK>Можно пример ситуации когда простой тип бокситься не будет, а структура будет?


Скажем так при вызове метода Proc(int a) и Proc(SomeStruct a), во втором случае для передачи значения типа int придется еще вызвать конструктор для SomeStruct. А при использовании a будут добавляться вызовы преобразования в int...
Re[5]: Есть ли аналог typedef в C#?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.12.03 09:31
Оценка:
Здравствуйте, csharpamateur, Вы писали:

C>>>Однако если для простых типов boxing случается не всегда, то для struct к примеру конструктор будет вызываться всегда и implicit преобразование


AVK>>Можно пример ситуации когда простой тип бокситься не будет, а структура будет?


C>Скажем так при вызове метода Proc(int a) и Proc(SomeStruct a), во втором случае для передачи значения типа int придется еще вызвать конструктор для SomeStruct. А при использовании a будут добавляться вызовы преобразования в int...


А боксинг то где будет?
... << RSDN@Home 1.1.2 beta 2 (mobile station) >>
AVK Blog
Re[6]: Есть ли аналог typedef в C#?
От: csharpamateur  
Дата: 27.12.03 10:13
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, csharpamateur, Вы писали:


C>>>>Однако если для простых типов boxing случается не всегда, то для struct к примеру конструктор будет вызываться всегда и implicit преобразование


AVK>>>Можно пример ситуации когда простой тип бокситься не будет, а структура будет?


C>>Скажем так при вызове метода Proc(int a) и Proc(SomeStruct a), во втором случае для передачи значения типа int придется еще вызвать конструктор для SomeStruct. А при использовании a будут добавляться вызовы преобразования в int...


AVK>А боксинг то где будет?


Я про боксинг для структур не говорил. Я имел в виду boxing как дополнительную операцию, подобную вызову конструктора или оператора приведения типа для структуры.
Re[7]: using не подходит...
От: Lloyd Россия  
Дата: 29.12.03 06:51
Оценка:
Здравствуйте, csharpamateur, Вы писали:

L>>Это не поможет, т.к. стековые (локальные) переменные видны не будут.


C>Собственно WorkerClass в данном случае и есть отдельный класс для метода, т.е. мы всю функцию переносим в DoTheWork

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

Вообще-то интерфейсом класса называют его публичные методы, так что если ты не хочешь забивать интерфейс -- не забивай. Делай "не нужные" функции приватными и все.
... << RSDN@Home 1.1.2 beta 1 >>
Re[5]: Есть ли аналог typedef в C#?
От: mihailik Украина  
Дата: 29.12.03 12:04
Оценка:
S> К сожалению get тормозят, правда совсем немного, но до инлайн не дотягивают.

Как повезёт. Некоторые JIT инлайнит, некоторые нет.
... << RSDN@Home 1.1.0 stable >>
Re: Есть ли аналог typedef в C#?
От: mihailik Украина  
Дата: 29.12.03 12:04
Оценка:
C>Т.е. например не int id, а MessageId id.

В Delphi.NET для этого используются enum'ы. В принципе с int совместимы, но формально тип другой. По-моему это как раз то, что ты ищешь.


P.S. Лично я за то, чтобы Message ID были бы int, а не особым типом.
... << RSDN@Home 1.1.0 stable >>
Re[6]: Есть ли аналог typedef в C#?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 29.12.03 12:38
Оценка:
Здравствуйте, mihailik, Вы писали:

S>> К сожалению get тормозят, правда совсем немного, но до инлайн не дотягивают.


M>Как повезёт. Некоторые JIT инлайнит, некоторые нет.

А чуть чуть поподробнее, насчет некоторых, имеется ввиду для нормальных компьютеров.
Во всяком случае в Видби да и в 2003 даже очень маленькие функции не инлайнятся.
Кстати по поводу в MSDN за сентрябрь ".Net Remoting" Реализация нестандартного маршалинга на основе .Net Remoting и Сom Interop. Кстати RealProxy можно создавать на основе интерфейса и переопределять его Invoke для удаленного доступа например через сокеты. Задача намного проще чем например в нативном TSocketConnection. Или на основе отображения генерить свои классы, только с одним аналогом транспарент прокси для ускорения. Интересно помтреть как в Delphi.Net реализована Corba.
Кстати http://homepages.borland.com/jkaster/ccds/delphi8/index.html

http://homepages.borland.com/jkaster/ccds/delphi8/remobjects_software/remobjects_client_sdk_for_net_borland_edition/Info.html
например
RemObjects SDK introduces the fast and efficient BinMessage protocol for this, a protocol that is both compact and efficient to parse/generate. This allows you to build clients and servers that consume fewer resources parsing requests and building response packets; it also allows you to build clients and servers that consume as little bandwidth as necessary when communication. This is especially important when building clients that will connect to the server via dialup connections or GSM/GPRS wireless networks.
и солнце б утром не вставало, когда бы не было меня
Re[7]: Есть ли аналог typedef в C#?
От: mihailik Украина  
Дата: 29.12.03 14:45
Оценка:
M>>Как повезёт. Некоторые JIT инлайнит, некоторые нет.
S> А чуть чуть поподробнее, насчет некоторых, имеется ввиду для нормальных компьютеров.

Это одному Микрософту известно. В Роторе вроде бы, значительная часть оптимизаций не включена. Я точно не знаю, возможно какая-то функциональность по инлайнам есть и в Роторе.

Инлайн происходит во времы JIT-ования методов. Когда IL-код метода компилируется в x86-ассемблер, вызовы функций могут быть заменены на подстановку.

S>Во всяком случае в Видби да и в 2003 даже очень маленькие функции не инлайнятся.


Сдаётся мне, ты предполагаешь увидеть инлайн в IL-коде. А он происходит только в момент JIT. Причём, из-за такого способа, возможно инлайнить функции даже из чужих сборок.



S> Кстати по поводу в MSDN за сентрябрь ".Net Remoting" Реализация нестандартного маршалинга на основе .Net Remoting и Сom Interop.


Это к чему вдруг ремотинг?
... << RSDN@Home 1.1.0 stable >>
Re[8]: Есть ли аналог typedef в C#?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 29.12.03 14:54
Оценка: 18 (1)
Здравствуйте, mihailik, Вы писали:

M>>>Как повезёт. Некоторые JIT инлайнит, некоторые нет.

S>> А чуть чуть поподробнее, насчет некоторых, имеется ввиду для нормальных компьютеров.

M>Это одному Микрософту известно. В Роторе вроде бы, значительная часть оптимизаций не включена. Я точно не знаю, возможно какая-то функциональность по инлайнам есть и в Роторе.


M>Инлайн происходит во времы JIT-ования методов. Когда IL-код метода компилируется в x86-ассемблер, вызовы функций могут быть заменены на подстановку.



S>>Во всяком случае в Видби да и в 2003 даже очень маленькие функции не инлайнятся.


M>Сдаётся мне, ты предполагаешь увидеть инлайн в IL-коде. А он происходит только в момент JIT. Причём, из-за такого способа, возможно инлайнить функции даже из чужих сборок.

Выводы исключительно по тестам.


S>> Кстати по поводу в MSDN за сентрябрь ".Net Remoting" Реализация нестандартного маршалинга на основе .Net Remoting и Сom Interop.


M>Это к чему вдруг ремотинг? :???

А это к пятничному разговору.
и солнце б утром не вставало, когда бы не было меня
Re[3]: using не подходит...
От: latemic Украина  
Дата: 14.12.06 15:31
Оценка:
Здравствуйте, csharpamateur, Вы писали:

C>Здравствуйте, Dr_Sh0ck, Вы писали:


C>Псевдоним (alias) который назначается через using виден только внутри файла или namespace в котором он объявлен.


А можно ли сделать такой адиас видимым вне сборки, что-то типа [public] typedef для COMa?
"Если нельзя, но очень хочется... то можно"
Re[4]: using не подходит...
От: _FRED_ Черногория
Дата: 14.12.06 16:12
Оценка:
Здравствуйте, latemic, Вы писали:

C>>Псевдоним (alias) который назначается через using виден только внутри файла или namespace в котором он объявлен.


L>А можно ли сделать такой адиас видимым вне сборки, что-то типа [public] typedef для COMa?


В C# — нет. В Немерле, например, да (Type alias). Но использовать можно будет, опять же, так же с Немерле.
... << RSDN@Home 1.2.0 alpha rev. 665>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Re[7]: Есть ли аналог typedef в C#?
От: SerkMan  
Дата: 15.12.06 07:36
Оценка:
Здравствуйте, csharpamateur, Вы писали:

C>Я про боксинг для структур не говорил. Я имел в виду boxing как дополнительную операцию, подобную вызову конструктора или оператора приведения типа для структуры.


Боксинг в Net это преобразование Value-типа в Referense-тип.
Вызов конструктора будет как для int так идля struct MyStruct.

По поводу вложенных методов разбивай методы и недумай в итоге их соберут в один (благодоря JIT).

И лучше использовать свойства вместо введения нового типа. Если свойство не виртуальное и не содержит сложной обработки то оно будет заинлайнено JIT-ом.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.