:: Не фоксом единым
C# typeof
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Если сделать:

Console.WriteLine(typeof(string).Name);

высвечивается "String". Если сделать:

struct Eee { }
[...]
Console.WriteLine(typeof(Eee).Name);

высвечивается "Eee". Конечно, логика понятна. Вопрос - как для типа Eee получить "struct"?
Ratings: 0 negative/0 positive
Re: C# typeof
Рома

Сообщений: 1079
Дата регистрации: 06.06.2001
Если typeof(Eee).IsValueType то это "struct"
Ratings: 0 negative/0 positive
Re: C# typeof
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
На сколько вижу, IsValueType - это проверка "является ли тип значимым". Возвращает True.
Ratings: 0 negative/0 positive
Re: C# typeof
Рома

Сообщений: 1079
Дата регистрации: 06.06.2001
Ну да.
Тебе же вроде надо разделить struct (value type) или class (reference type)?
Ratings: 0 negative/0 positive
Re: C# typeof
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Не совсем. Хотелось бы увидеть слово "struct" исходящее из глубин CLR.



Исправлено 1 раз(а). Последнее : S-type, 20.02.17 13:40
Ratings: 0 negative/0 positive
C# typeof
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
То то типа:

Console.WriteLine(typeof(Eee).что_то);
Ratings: 0 negative/0 positive
Re: C# typeof
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Там (в глубинах) никаких struct нету. Это ключевое слово языка C#, к CLR прямого отношения не имеющее. В CLR есть базовый тип для всех структур под названием System.ValueType. Ну и указанное свойство-флаг IsValueType

msdn.microsoft.com

MSDN
Value types are types that are represented as sequences of bits; value types are not classes or interfaces. Value types are referred to as "structs" in some programming languages. Enums are a special case of value types.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: C# typeof
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Т.е. слово "struct" в явном виде мне не увидеть... Только по "косвенным признакам"
Ratings: 0 negative/0 positive
Re: C# typeof
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Естественно.
Не понятно сие желание. И чем не устраивает предложенное решение - ибо оно по сути отвечает на вопрос является тип "структурой", или же "классом". Ну с небольшим уточнением по поводу enum (есть свойство IsEnum для этого) - конечно если их нужно отделить от struct...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: C# typeof
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Почему String или Int32 можно увидеть, а "struct" нельзя (риторически)?
Ratings: 0 negative/0 positive
Re: C# typeof
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Потому что System.String это конкретный класс, System.Int32 - тоже. Те же int или string увидеть нигде нельзя.
struct это вообще абстракция (как и class, interface, enum, event, delegate) - это НЕ нечто конкретное. Это шаблон для создания чего-то конкретного, что как раз вполне можно увидеть - как твой класс "Eee". Равно можно увидеть его "свойсвта", в т.ч. и то что он был порождён синтаксической конструкцией struct. Можно даже увидеть его базовый тип - который есть System.ValueType - он одинаков для всех структур.
Не понимаю чего ещё ты хочешь увидеть, и для чего это может быть нужно... И так всё видно - для любых мыслимых применений


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: C# typeof
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Igor Korolyov
Потому что System.String это конкретный класс, System.Int32 - тоже. Те же int или string увидеть нигде нельзя.

На сколько понимаю, int это псевдоним для System.Int32. Соответственно:

Console.WriteLine(typeof(int).FullName);
Console.WriteLine(typeof(System.Int32).FullName);

возвращают System.Int32.

Igor Korolyov
struct это вообще абстракция

Если попробовать, то

Console.WriteLine(typeof(struct).FullName);

даже не компилируется - пишет "Требуется тип". Т.е. struct - это не тип, это всего навсего ключевое слово с помощью которого можно описать некую конструкцию (тип), с помощью которой выделить память (создать объект)...

Буду знать.

Igor Korolyov
Не понимаю чего ещё ты хочешь увидеть, и для чего это может быть нужно... И так всё видно - для любых мыслимых применений

Понять хочу, как это устроено



Исправлено 1 раз(а). Последнее : S-type, 20.02.17 20:41
Ratings: 0 negative/0 positive
Re: C# typeof
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Недавно мне анекдот рассказали. Идёт концерт, выходит на сцену гитарист, начинает играть разные сложные аккорды то тихо, то громко, то быстро, то медленно, быстро перебегает от нижних нот к высоким и наоборот... Народ послушал, жидко так похлопал. Потом выходит старый опытный гитарист, и на трёх аккордах играет простенькую мелодию. Зал при этом взрывается, заваливают гитариста цветами, требуют "на бис". После концерта подходит молодой к опытному и спрашивает "я виртуозно владею всеми особенностями гитары, а ты всего тремя аккордами завёл толпу. ка же так?" На что опытный отвечает "ты только ищешь свои аккорды, а я их уже нашёл".

Анекдот мне рассказали не просто так, а после того, как я вышел на какой то сайт, где были тесты по C#, и не набрал даже 50%. Потому как вопросы типа "найдите в программе ошибку" жутко напрягают - IDE (точнее, компилятор) всегда ищет ошибки гораздо лучше и быстрее меня. И смысл не в том, что бы найти ошибку, а в том, что бы её исправить. IMHO, подобные вопросы по большей части бесполезны. Так же, на мой взгляд, вопросы типа "может ли быть индексатор статическим" то же особого ума не прибавляют. Но, с другой стороны, полезно иногда задуматься "почему так, а не иначе".
Ratings: 0 negative/0 positive
Re: C# typeof
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
S-type
На сколько понимаю, int это псевдоним для System.Int32.
Да, но прежде всего это ключевое слово языка C# - и посему его не может быть нигде в CLR - это лишь инструкция компилятору.
S-type
Т.е. struct - это не тип, это всего навсего ключевое слово с помощью которого можно описать некую конструкцию
Именно так. При том System.ValueType это таки тип, он является "базовым" для всех структур, при том он весьма специфичен - например его нельзя явно назначить базовым ни для какого своего класса (при том что ключевое слово struct как раз именно его и назначает базовым для описываемого класса-структуры). Что ещё более интересно, хотя он и является базовым для структур, сам он на вопрос IsValueType ответит false
S-type
с помощью которой выделить память (создать объект)...
Не совсем так. Описание типа не выделяет никакой памяти. Память выделяет оператор new при создании экземпляра (для статических полей - сам рантайм при инициализации типа - обычно при первом обращении к нему) - вот как он это делает - это определяет тип...
S-type
Понять хочу, как это устроено
Похвально - но прежде надо бы все "основы" вызубрить. А уж потом читать про внутренности CLR и всякие особенности реализации.

S-type
вопросы типа "найдите в программе ошибку" жутко напрягают
Если они про синтаксическую ошибку - ну это механистический подход к проверке знаний... Чем-то напоминает боянистую историю про тупого ребёнка, которого научили тому что "Амазонка самая длинная река в мире", но ответить на вопрос "какая река самая длинная" он не может - а спрашиваешь "что такое Амазонка" - он как попугай повторяет заученную фразу
Вот ЛОГИЧЕСКИЕ ошибки - это совершенно другое дело! Никакой компилятор их не найдёт и не "подсветит", а уметь их находить - жизненно важно для разработчика!

P.S. На вопрос про статический индексатор можно нагуглить кучу инфы - ибо ответ то весьма интересный они банально "не посчитали нужным такое реализовывать". Что ещё интереснее, сам CLR никак не воспрещает подобный "индексатор" соорудить - ведь индексатор это банально метод (или два) со специальным именем и метаданные связывающие это хозяйство для удобства кодирования. Соответственно в редакторе IL кода можно спокойно сделать статический get_Item/set_Item и тем самым получить по сути "статический индексатор" Естественно недоступный C# и даже VB коду, но в IL вполне себе работоспособный
И в принципе не исключено что в какой-либо из будущих версий C# появится и static[...] или там class[...] наравне с this[...] И станет реальной так вожделенная многими фишка замены Encoding.GetEncoding("ru") на Encoding["ru"]


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: C# typeof
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Цитата:
Я понять тебя хочу,
Смысла я в тебе ищу.

(А.С. Пушкин)
Ratings: 0 negative/0 positive
Re: C# typeof
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Igor Korolyov
Не совсем так. Описание типа не выделяет никакой памяти. Память выделяет оператор new при создании экземпляра (для статических полей - сам рантайм при инициализации типа - обычно при первом обращении к нему) - вот как он это делает - это определяет тип...

На сколько понимаю, при работе со структурами оператор new не нужен и просто игнорируется.

Eee eee;

и

Eee eee=new Eee();

ни чем не отличаются.
Ratings: 0 negative/0 positive
Re: C# typeof
Рома

Сообщений: 1079
Дата регистрации: 06.06.2001
S-type

На сколько понимаю, при работе со структурами оператор new не нужен и просто игнорируется.

Eee eee;

и

Eee eee=new Eee();

ни чем не отличаются.

new Eee() и default(Eee) одно и то же в случае структур.
Поэтому для структуры нельзя определить конструктор по умолчанию, но с параметрами сколько угодно.
Ratings: 0 negative/0 positive
Re: C# typeof
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
S-type
На сколько понимаю, при работе со структурами оператор new не нужен и просто игнорируется.
Eee eee;
и
Eee eee=new Eee();
ни чем не отличаются.

Отличаются.
Сам попробуй
Eee eee;
Console.WriteLine(eee.someField);
и
Eee eee = new Eee();
Console.WriteLine(eee.someField);


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: C# typeof
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Igor Korolyov
Отличаются.
Сам попробуй

Попробовал.

На

Eee eee;
Console.WriteLine(eee.someFIeld);

компилятор ругается

Цитата:
Использование поля "someFIeld", которому, возможно, не присвоено значение.

Блин... Где тут смайлик "биться головой о стену"...

В общем, не использовал ни когда структуры (классами как то обходился ), и дальше, судя по всему, не буду. Не, брошу C# и буду программировать на Java. Не, брошу программировать и уйду в монастырь...
Ratings: 0 negative/0 positive
Re: C# typeof
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Экземпляр структуры это объект?

Такой код:

Eee eee=new Eee();

Вопрос, еее - это объект?
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 9 (Гостей: 9)

© 2000-2024 Fox Club 
Яндекс.Метрика