Помощь новичкам

Пожалуйста, прекратите лить воду, сообщая общеизвестное.

Я понимаю, что это классы, вопрос был о том, насколько можно судить по результату, возвращаемому typeof( ), о том, размерный или строковый тип имеет объект? Понятно, что проверяя на IsClass для все классов мы получаем True. Мое мнение - опираться на typeof - не довод.

да, если размерный в строгом смысле, на уровне IL (не в смысле эмуляции)

Тогда я сделаю маленькое отступление. Знание о том, относится тип к размерному или ссылочному должно давать нам понимание механизма обращения к объекту программы, спрятанному за его именем.Т.е. по идее мы можем предсказать, что произойдет при попытке присваивания var x:=y - копирование ссылки или значения. При обмене с подпрограммами мы также можем спрогнозировать, что будет, если передать параметр по значению, по ссылке const или по ссылке var. Это на уровне языка. Внутренняя кухня при этом каждому пользователю не нужна совершенно, поэтому эмуляция там или что - непринципиально. Важно то, как это проявляется именно на уровне входного языка. Потому что IL-дела могут интересовать, если поднимать вопросы оптимизации, например. Посему пользователю важно точно знать, что является именно на уровне языка размерным, а что - ссылочным типом.

Вы пытались убедить в обратном, ссылаясь на справку.

Я не убедить пытался (у меня нет для этого аргументов) а напрямую цитировал Справку и писал о том, что налицо противоречие, которое разрешить могут только разработчики.

Может быть каким-то школьникам и не надо. Они код сдали и забыли как страшный сон. Для эффективного программирования необходимо знать все тонкости.

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

А с этим никто не спорит. Но этой информации в Справке нет. И быть не может, кстати. В Справке общая информация, для всех.

1 лайк

Т.е. с точки зрения именно языка, его семантики, в Справке все верно? Если говорить не о том, как оно реализовано или в IL, а на уровне входного языка, если отрешиться от конкретной реализации? Ну вот как если бы компилятора вообще не было, а лишь на бумаге? Язык - он же должен допускать первичное изучение с мелом и классной доской?:

Ну так правильно. Только в предыдущем сообщении не было ни слова про справку. А вообще, разработчики не рекомендуют использовать статические массивы и короткие строки. И правильно делают.

А это это потому, что Вы вклинились в общение, а не прочитали все от начала. Так как раз и было о Справке и дальше все шло с этой же позиции.

А про это Вы для чего пишете? Тут в обсуждении кто-то предлагает ими пользоваться?

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

Из Справки:

К размерным относятся все простые типы, указатели, записи, статические массивы, множества и строки.

К ссылочным типам относятся классы, динамические массивы, файлы и процедурный тип

@Admin Надо бы исправить формулировки.

Возможно, тут все не так однозначно. Не случайно @ibond так осторожно и с оговорками формулировал свои посты. Как я понимаю проблему, есть язык на семантическом уровне, есть его конкретная реализация с компиляцией в IL и есть реализация IL в .NET. И не обязательно то, что подразумевает семантика, компилируется именно так в IL. Поэтому говорилось о некоей эмуляции, т.е. моделировании (или отображении) семантических понятий в “.NET-потрошки”

А вот что именно Справка отображает - это вопрос.

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

Хотя в справке (не?)верно указано, например

, но в чём разница, если для гурманов есть тот же stringbuilder?

Не уверен, никогда не использовал, но вроде, к примеру, у StringBuilder-а нету вкусняшек вроде Split.

Строки в 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-семантика. При передаче в процедуру и присваивании строки не копируются

COW - It’s a Copy-on-Write? А как же многопоточность тогда? Не страдает?

Но на самом деле, как мне кажется, для новичков изучающих язык главное - не чем строка является, а как она себя ведет в программе. Если строка при присваивании и передаче в процедуру без var/const копируется, она может быть хоть суперклассом, но для пользователя она размерная. Если не копируется - она для пользователя ссылочная. Или нет?

Почему она должна быть размерной? Наоборот, там просто ссылка передается и ничего не копируется. Следовательно, ссылочная модель. С одним исключением: при изменении символа строки через индексатор она копируется. Ставить строку в один ряд с размерными типами неправильно. Это нечто среднее.

1 лайк

Да потому что я сам уже со всеми этими терминологическими игрищами запутался! )))) Думаю про одно, а пишу другое.Я там подправил.

Т.е. строки в реализации не ссылочные, но и не размерные. Как я помню, вы меж собой называете их “волшебными”. А какие типы еще обладают волшебством? Множества, кажется?

А если я подобным образом (присваивание и передача в процедуру) протестирую и другие типы данных - это будет достаточным основанием самостоятельно отнести их к размерному или ссылочному типу?