0 / 0 / 0
Регистрация: 10.01.2020
Сообщений: 15

Ref string не работает

29.04.2021, 20:06. Показов 3719. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Совершенно не понял, по каким причинам string даже через ref не хочет меняться (уже странно было то, что ссылочный тип и его значения по ссылке нельзя менять сразу, ну да ладно).

Допустим, вот такой код:

C#
1
2
3
4
5
class DD {
            public void DoAct(ref string basicCommand) {
                basicCommand[0] = '0';
            }
        }
Не желаю использовать массивы char и также любой unsafe. Есть хоть какой-то шанс?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.04.2021, 20:06
Ответы с готовыми решениями:

Ссылочный тип string( использование ref)
Вопрос такой. При передаче методу параметром ссылочный тип( например массив) изменения видны в месте вызова. а почему если передать строку...

Не работает ref параметр
Пишет,что не удалось скопировать. Вот код: /* * Created by SharpDevelop. * User: User * Date: 05.02.2016 * Time: 21:40 ...

Как работает ключевое слово ref
Здравствуйте. Есть вопрос оп технической части работы С#. Я в нем еще совсем новичок. Точнее по работе ключевого слова ref. Не могу понять...

17
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
29.04.2021, 20:15
Лучший ответ Сообщение было отмечено RARiliar как решение

Решение

RARiliar, string не редактируется. Просто примите как данность. Можно создать только новый string или использовать другие типы данных, например StringBuilder.
0
 Аватар для esperanto_qun
1124 / 656 / 393
Регистрация: 28.01.2021
Сообщений: 1,336
29.04.2021, 20:15
RARiliar, Строка неизменяемый тип, при чем тут ref??
1
0 / 0 / 0
Регистрация: 10.01.2020
Сообщений: 15
29.04.2021, 20:20  [ТС]
esperanto_qun, при том, что это чрезвычайно необычно и в спецификации об этом ни слова? При чём когда-то другой человек спрашивал это же, но там ему ответили использовать ref и всех всё устраивало (??????). Какой-то балаган.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
29.04.2021, 20:25
Цитата Сообщение от RARiliar Посмотреть сообщение
и в спецификации об этом ни слова?
О какой спецификации идет речь? В официальной документации, к примеру, об этом говорится в первом же абзаце.
https://docs.microsoft.com/ru-... mework-4.8

Еще можете тут почитать.
https://metanit.com/sharp/tutorial/7.3.php
0
 Аватар для esperanto_qun
1124 / 656 / 393
Регистрация: 28.01.2021
Сообщений: 1,336
29.04.2021, 20:27
RARiliar, что конкретно в вашей задаче надо сделать?

1. Изменить строку:

C#
1
basicCommand = basicCommand.Remove(0, 1).Insert(0, "0");
Для этого можно используя кучу методов string.

2. Или получить строку не возвращая, по ссылке? Тогда можно использовать не только ref, но и out:

C#
1
2
3
4
5
6
7
        static void Main()
        {
            string text = "Mey text";
            DoAct(ref text);
            Console.WriteLine(text);
        }
        static void DoAct(ref string basicCommand)=> basicCommand = basicCommand.Remove(0, 1).Insert(0, "0");
1
0 / 0 / 0
Регистрация: 10.01.2020
Сообщений: 15
29.04.2021, 20:30  [ТС]
QuakerRUS

Я читал вот это https://docs.microsoft.com/ru-... troduction

В остальное я не вчитывался. Там это назвали ссылочным типом, пояснили как они работают, а в других материалах они ломают свои же установленные правила, при чём дважды. Простите, но это выше моего понимания.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
29.04.2021, 20:31
Цитата Сообщение от RARiliar Посмотреть сообщение
Не желаю использовать массивы char и также любой unsafe. Есть хоть какой-то шанс?
Нет. string неизменяемый тип. Поэтому только массив char[], StringBuilder или хаки через unsafe.
Вот тут еще какие-то хаки через Reflection https://gist.github.com/dtao/3371692...
1
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
29.04.2021, 20:48
Цитата Сообщение от RARiliar Посмотреть сообщение
Там это назвали ссылочным типом, пояснили как они работают
Да, это ссылочный тип, и к нему применяются все правила, что и к другим ссылочным типам. Однако сам контейнер является неизменяемым, что не противоречит правилам ссылочных типов, а так же перегружен метод Equals и операции проверки равенства, чтобы сравнивались не адреса объектов как это происходит у ссылочных типов, а сами значения.

Добавлено через 11 минут
RARiliar, если что, я говорю про ссылочный тип string (а не про ссылочный параметр ref), который является классом, а все классы - ссылочные типы.
1
0 / 0 / 0
Регистрация: 10.01.2020
Сообщений: 15
29.04.2021, 21:27  [ТС]
esperanto_qun, basicCommand по сути должна была являться строкой, инициализируемой в глобальной области видимости, выполняющей функцию хранения в себе определённого кода, разного размера, для дальнейшей его передачи куда надо. Я хотел сделать это без каких-либо провисаний и лишних костылей, т.к. подобных команд может записываться несколько миллионов штук, а то и десятков миллионов в секунду, на протяжении всей работы программы (т.е. важна скорость). Но всё ещё хуже, т.к. различные методы записи туда символов, по стандарту, могут вписывать не более одного символа за раз. Так что все вот эти безопасные и "нужные" копирования туда-сюда вообще не в тему. Статические свойства класса тут тоже не подходят, если не извертеться раком с наследованием (т.е. сделать код немного уродливым).
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
29.04.2021, 21:37
Лучший ответ Сообщение было отмечено RARiliar как решение

Решение

RARiliar, посмотрите в сторону StringBuilder. А так же на его свойство Capacity в целях оптимизации выделения памяти, если размер строки планируется часто увеличивать. Так же в конструкторе можно задать сразу количество первоначально выделяемой памяти.
1
dive
 Аватар для I can
4969 / 4665 / 847
Регистрация: 13.04.2015
Сообщений: 9,863
29.04.2021, 21:48
Лучший ответ Сообщение было отмечено RARiliar как решение

Решение

Цитата Сообщение от RARiliar Посмотреть сообщение
C#
1
2
3
4
public void DoAct(ref string basicCommand) {
 basicCommand[0] = '0';
 }
 }
Так можно сделать
C#
1
2
3
4
5
        public void DoAct(ref string basicCommand)
        {
            basicCommand = '0' + basicCommand.Substring(1);
 
        }
1
0 / 0 / 0
Регистрация: 10.01.2020
Сообщений: 15
29.04.2021, 22:01  [ТС]
I can, да, работает, но для меня не подходит, насколько я могу понимать работу данного метода.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
29.04.2021, 22:01
Цитата Сообщение от RARiliar Посмотреть сообщение
Я хотел сделать это без каких-либо провисаний и лишних костылей, т.к. подобных команд может записываться несколько миллионов штук, а то и десятков миллионов в секунду, на протяжении всей работы программы (т.е. важна скорость).
Так просто меняйте ссылку с одной команды на другую. Зачем менять строку?

Да и вообще в .NET изменяемая строка это StringBuilder...
1
0 / 0 / 0
Регистрация: 10.01.2020
Сообщений: 15
29.04.2021, 22:09  [ТС]
Someone007, суть именно в том, что basicCommand нужно записывать и перезаписывать каждый раз. Каждая команда имеет свой синтаксис, т.е. это мини программирование. И оно становится большим, когда таких команд генерируется очень много.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
29.04.2021, 22:45
Всё равно не понятно... Ну вот сгенерировали вы команду, потом просто передаете её куда надо... Зачем что-то изменять?

Добавлено через 30 минут
И вообще почему вы используете для этого строки? Не лучше ли было бы числовые переменные использовать?
0
0 / 0 / 0
Регистрация: 10.01.2020
Сообщений: 15
29.04.2021, 22:45  [ТС]
Someone007, существует класс Action, в нём есть метод DoAct. Также есть enum ActionType, в котором кол-во ключей == кол-ву действий в DoAct. Существует 2 типа действий: Те, которые требуют команд, и те, которое не требуют их. Команды, в большинстве случаев, создаются именно теми действиями, которым команды для функционирования не нужны, как например: написание цифры, буквы, спец. символа. Тут соблюдается принцип квантования, т.е. любое безкомандное действие делает что-то одно и очень простое, не целые, блин, слова или конструкции. Соответственно, нельзя записать команду залпом и тут же её куда-то передать, тут нужно постоянное дополнение одной и той же строки, которая в будущем станет полноценной командой. Командные же действия требуют определённого синтаксиса, т.е. сложных инструкций для своей работы.

Я был бы очень рад сделать методы с параметрами и без для реализации этого всего, только вот параметров может быть слишком много (выше возможного на c#) и также нужно следить за типами параметров в таком случае, что отдельный напряг.
0
Эксперт .NET
 Аватар для Usaga
14321 / 9411 / 1356
Регистрация: 21.01.2016
Сообщений: 35,474
30.04.2021, 06:22
Цитата Сообщение от RARiliar Посмотреть сообщение
тут нужно постоянное дополнение одной и той же строки, которая в будущем станет полноценной командой.
Из всего выше описаннного совершенно не понятно, как вы к этому умозаключению пришли. Строки тут причём? И уже причём тут необходимость изменения самой строки?

Если у вас некий процесс формирующий строку, то вам нужен StringBuilder (если вам поступают фрагменты строк) или коллекция неких типов на основе которой финальная строка и будет сформирована.

А текущая хотелка адекватной не выглядит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.04.2021, 06:22
Помогаю со студенческими работами здесь

String to Ref
use feature "say"; use Devel::Peek; my $s = "string value"; my $ref = \$s; my $stringref = $ref.""; say...

Конструктор неявного преобразования из double и System::String ^ в ref class
Кто знает, как это реализовать, чтобы, например, был возможен код: public ref class MyClass { double number; System::String...

REF Ariston BCB31AAE нужна прошивка индикации, Не работает, выдает ошибку F9
Здравствуйте уважаемые форумчане! Принесли модули силовой и индикации( два комплекта) BCB31AA 207065180*47779130100. Ведут себя...

Полиморфизм: ошибка преобразование типа из "ref cl_child" в "ref cl_proto" невозможно
Создал класс предок cl_proto, объявил класс потомок cl_child : cl_proto. Написал отдельную функцию с параметром-типом ref cl_proto - на...

Ошибка Cannot convert from 'ref decimal' to 'ref decimal?
Здравствуйте подскажите пожалуйста почему в строке this.allTuriPoCeneTableAdapter.FillBy(this.turfirmaDataSet.AllTuriPoCene, ref Cena); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru