Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 10.01.2020
Сообщений: 15

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

29.04.2021, 20:06. Показов 3677. Ответов 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,574
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
sleep
 Аватар для I can
4931 / 4592 / 840
Регистрация: 13.04.2015
Сообщений: 9,749
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,574
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,574
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
14138 / 9367 / 1350
Регистрация: 21.01.2016
Сообщений: 35,243
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru