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


#1458

Строки - классы, объявленные в .NET, короткие строки - оболочка над обычными строками, т.е. тоже класс. То же самое касается и статических массивов. Они построены на базе динамических. Указатели - вообще муть.


#1459

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

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


#1460

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


#1461

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


#1462

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


#1463

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


#1464

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


#1465

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


#1466

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


#1467

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


#1468

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


#1469

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

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


#1470

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

Из Справки:

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

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

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


#1471

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

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


#1472

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

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

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


#1473

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


#1474

Строки в 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.

#1475

Это всего лишь COW-семантика. При передаче в процедуру и присваивании строки не копируются


#1483

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

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


#1484

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