Я понимаю, что это классы, вопрос был о том, насколько можно судить по результату, возвращаемому typeof( ), о том, размерный или строковый тип имеет объект? Понятно, что проверяя на IsClass для все классов мы получаем True. Мое мнение - опираться на typeof - не довод.
Тогда я сделаю маленькое отступление. Знание о том, относится тип к размерному или ссылочному должно давать нам понимание механизма обращения к объекту программы, спрятанному за его именем.Т.е. по идее мы можем предсказать, что произойдет при попытке присваивания var x:=y - копирование ссылки или значения. При обмене с подпрограммами мы также можем спрогнозировать, что будет, если передать параметр по значению, по ссылке const или по ссылке var. Это на уровне языка. Внутренняя кухня при этом каждому пользователю не нужна совершенно, поэтому эмуляция там или что - непринципиально. Важно то, как это проявляется именно на уровне входного языка. Потому что IL-дела могут интересовать, если поднимать вопросы оптимизации, например. Посему пользователю важно точно знать, что является именно на уровне языка размерным, а что - ссылочным типом.
Я не убедить пытался (у меня нет для этого аргументов) а напрямую цитировал Справку и писал о том, что налицо противоречие, которое разрешить могут только разработчики.
Ну, с этой точки зрения статические массивы и проч. это размерные типы, то есть копируются при присваивании и передаче в качестве аргумента (и не суть важно какими именно средствами копируются: тупым копированием блока памяти или поэлементно в методе класса).
Т.е. с точки зрения именно языка, его семантики, в Справке все верно? Если говорить не о том, как оно реализовано или в IL, а на уровне входного языка, если отрешиться от конкретной реализации? Ну вот как если бы компилятора вообще не было, а лишь на бумаге? Язык - он же должен допускать первичное изучение с мелом и классной доской?:
Ну так правильно. Только в предыдущем сообщении не было ни слова про справку. А вообще, разработчики не рекомендуют использовать статические массивы и короткие строки. И правильно делают.
По-любому в Справке тогда есть неточности, даже если игнорировать нюансы реализации. А именно, касательно динамических/коротких строк, а также файловых типов. Сейчас все строки в Справке записаны в размерные, а все файлы – в ссылочные типы.
Из Справки:
К размерным относятся все простые типы, указатели, записи, статические массивы, множества и строки.
К ссылочным типам относятся классы, динамические массивы, файлы и процедурный тип
Возможно, тут все не так однозначно. Не случайно @ibond так осторожно и с оговорками формулировал свои посты. Как я понимаю проблему, есть язык на семантическом уровне, есть его конкретная реализация с компиляцией в IL и есть реализация IL в .NET. И не обязательно то, что подразумевает семантика, компилируется именно так в IL. Поэтому говорилось о некоей эмуляции, т.е. моделировании (или отображении) семантических понятий в “.NET-потрошки”
Строки в PascalABC.NET размерные. Как и в обычном Паскале. Вот код, иллюстрирующий это:
procedure p(s: string);
begin
s[1] := '9';
end;
begin
var s := '123';
var s1 := s;
s[1] := '4';
Println(s,s1); // изменение s не приводит к изменению s1
p(s);
Println(s); // ничего с s не произошло. Если бы это был ссылочный тип, она поменялась бы
end.
COW - It’s a Copy-on-Write? А как же многопоточность тогда? Не страдает?
Но на самом деле, как мне кажется, для новичков изучающих язык главное - не чем строка является, а как она себя ведет в программе. Если строка при присваивании и передаче в процедуру без var/const копируется, она может быть хоть суперклассом, но для пользователя она размерная. Если не копируется - она для пользователя ссылочная. Или нет?
Почему она должна быть размерной? Наоборот, там просто ссылка передается и ничего не копируется. Следовательно, ссылочная модель. С одним исключением: при изменении символа строки через индексатор она копируется. Ставить строку в один ряд с размерными типами неправильно. Это нечто среднее.
Да потому что я сам уже со всеми этими терминологическими игрищами запутался! ))))
Думаю про одно, а пишу другое.Я там подправил.
Т.е. строки в реализации не ссылочные, но и не размерные. Как я помню, вы меж собой называете их “волшебными”. А какие типы еще обладают волшебством? Множества, кажется?
А если я подобным образом (присваивание и передача в процедуру) протестирую и другие типы данных - это будет достаточным основанием самостоятельно отнести их к размерному или ссылочному типу?