Кто-нибудь знаком с реализацией строк в Oxygen? Как там они классифицируются официально?
А во Free Pascal и Delphi?
Кто-нибудь знаком с реализацией строк в Oxygen? Как там они классифицируются официально?
А во Free Pascal и Delphi?
Немного поздно. Но, хочется заметить, что Вас никто не заставляет пользоваться данным языком. Проектом занимаются те, кому это действительно интересно и хочется…
Пока что контраргумент в том, что Вы, похоже, не можете привести пример кода, вызывающий проблему, а лишь теоретизируете. Т.е. “ну а вдруг”? Понимаете, вот взять броуновское движение молекул вещества. А вдруг в какой-то момент времени все молекулы, из которых состоит, например, стакан, одновременно двинутся вертикально вверх? Тогда стакан взлетит в воздух. Теория вероятности, кстати, не утверждает, что этот шанс нулевой. Он бесконечно мал - это да, но он есть. Так нам что, стаканы фиксировать на столе - а вдруг не вовремя взлетят?
А вот тут я с Вами полностью согласен, более того, Вы фактически повторили мой вопрос несколько иными словами.
А это называется придирками. Вы прекрасно сознаете, что проблема возникает из за моделирования поведения, в частности, строк одновременно по образцу предшественников PascalABC.NЕТ, и по образцу именно других NET-языков, в частности C#.
Вы это серьезно мне адресовали? Хотя… в Ваших высказываниях в мой адрес уже ничего не удивляет.
Я на полном серьёзе.
Не ясно каким образом это коррелирует с темой про строки…
using System;
namespace Test
{
class Program
{
public static void Main(string[] args)
{
string s1 = "12";
string s2 = "12";
Console.WriteLine(s1.Equals(s2)); // True
Console.ReadLine();
}
}
}
Про Equals(String) почитать можно здесь. Важный момент:
Determines whether this instance and another specified String object have the same value.
Про Equals(Object) можно почитать здесь.
Исходный код находится здесь (строка 570):
procedure p1(var ch: char) := ch := '_';
begin
var s1 := '123';
var s2 := '123';
s2[1] := '1'; // Вручную изменили символ, теперь строки не будут меняться вместе.
p1(s2[1]);
Println(s1, s2); // 123 _23
end.
Да, увидел, но это далеко не самый страшный глюк WinForms)) Разработчики отказались исправлять их, лучше делайте формы руками, кодом а не графическим редактором.
@Admin насчёт строк и передачи их символов как var-параметров, предлагаю производить дополнительное копирование если символ строки решили передать как var-параметр и при этом выводить предупреждение, про то что это медленно.
У кого то есть претензии к этому решению? И, предлагайте что то своё тоже, можно будет голосование запустить, если наберётся несколько хороших идей.
А для чего, собственно? Ради терминологии? А с множествами не пробовали поэкспериментировать? Тоже найдете много интересного.
Для того, чтоб 2 строки в разных частях, и, возможно, потоках - не меняли друг друга. Эту ошибку будет нереально поймать, поэтому надо сделать так, чтоб программист её случайно не пропустил.
А они меняют? Это кто-то подтвердил?
Выше было несколько кодов. Вот почитайте.
Строки могут иметь общее значение даже между AppDomain-ам, то есть, если я правильно понимаю - они могут даже быть общими между несколькими .exe файлами, если они используют одну .dll !
И зачем Вы отсылаете в коды C#, если в PascalABC.NЕТ своя реализация этих строк?
В общем, чтобы не тянуть бесконечную дискуссию, резюме: я против любых ковыряний в строках, пока разработчики не признают, что проблема существует.
У паскаля нету своей реализации строк. Это реализация общая для .Net . Вот доказательство что это работает между потоками.
var
lock_obj := new class(state := 0);
procedure thr1;
begin
var s := 'abc';
while lock_obj.state < 1 do Sleep(10);
lock lock_obj do
begin
Swap(s[1],s[2]);
write($'Swap выполнено, теперь строка = "{s}"');
readln;
lock_obj.state := 2;
end;
end;
procedure thr2;
begin
var s := 'abc';
lock lock_obj do
begin
write('2 потока успешно запущены');
readln;
lock_obj.state := 1;
end;
while lock_obj.state < 2 do Sleep(10);
lock lock_obj do
begin
write($'и другая строка = "{s}"');
readln;
halt;
end;
end;
begin
System.Threading.Thread.Create(thr1).Start;
thr2;
end.
То что между AppDomain-аму работает вам тоже так доказывать, или наконец всё же поверите, что паскаль это надстройка над .Net , наследующая все свойства .Net ?
Да я уже объяснял это:
И получил это:
И что Вы этим кодом доказали? Что строки в многопоточности работают так, как им положено - если строка меняется в одном потоке, это вызывает ее изменение в другом? А кто-то сомневался, что все нормально?
1 переменная в 1 потоке не должна менять другую переменную из другого потока. Посмотрите внимательно, это 2 отдельные переменные s
, которые никак друг друга никогда не касались.
Обратите внимание, что в C# следующий код вернет три раза True:
string s = "123";
string s1 = "123";
Console.WriteLine(s == s1);
Console.WriteLine(s.Equals(s1));
Console.WriteLine(Object.ReferenceEquals(s,s1));
Как и у нас. Особенно интересно, почему True в последнем случае