powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# Расширяющий метод не изменяет значение вызывающей переменной.
10 сообщений из 10, страница 1 из 1
C# Расширяющий метод не изменяет значение вызывающей переменной.
    #38514149
Andrey_VP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, уважаемые форумчане.

Подскажите, как сделать так чтобы расширяющий метод изменял значение вызывающей переменной?

Пример:
расширяющий метод:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public static string AddStringWithSeparator(this System.String str, string addingString, string separator = ",")
        {
            if (addingString.Length != 0)
            {
                if (str != "")
                    str += separator;
                str += addingString;
            }
            return str;
        }


Я хочу чтобы после
Код: c#
1.
2.
string s = "";
s.AddStringWithSeparator("abc");


в переменной s было бы "abc".

Вобщем, как сделать this System.String str ссылочной переменной?
...
Рейтинг: 0 / 0
C# Расширяющий метод не изменяет значение вызывающей переменной.
    #38514172
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тип string сам по себе ссылочный, поскольку является объектом. В данном случае имеет место быть передача ссылки по значению , и это не изменить никак, поскольку первый параметр extension-метода, передающий ссылку на экземпляр расширяемого класса, не может быть ref или out - это ссылка на вызывающий объект, и она не может быть изменена. Это во-первых. Во-вторых, тип string - immutable, и методы, изменяющие строки, всегда возвращают новый экземпляр типа. В-третьих, использовать конкатенацию строк для аккумулирования - убийство производительности и памяти. В данном случае нужно использовать StringBuilder.
...
Рейтинг: 0 / 0
C# Расширяющий метод не изменяет значение вызывающей переменной.
    #38514192
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey_VP, По коду и требованию - узнаю федерала...............
...
Рейтинг: 0 / 0
C# Расширяющий метод не изменяет значение вызывающей переменной.
    #38514255
Andrey_VP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за совет!

"Где-то в степи", нет, я не такой.
...
Рейтинг: 0 / 0
C# Расширяющий метод не изменяет значение вызывающей переменной.
    #38514265
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey_VP,
если перефразировать ваш топик на политический контент
то получится - Если они попытаются расширить список Магнитского - Мы отключим горячую воду в Костроме
...
Рейтинг: 0 / 0
C# Расширяющий метод не изменяет значение вызывающей переменной.
    #38514266
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныВ-третьих, использовать конкатенацию строк для аккумулирования - убийство производительности и памяти

Не совсем корректное утверждение. Для небольшого количества конкатенаций с небольшими по размеру строками скорость простого сложения будет выше, чем генерация класса StringBuilder с последующими затратами на вызов методов Append и иже...

Что касается памяти, то GC - рулит :-) С мелкими объектами на раз расправляется...
...
Рейтинг: 0 / 0
C# Расширяющий метод не изменяет значение вызывающей переменной.
    #38514297
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Для небольшого количества конкатенаций с небольшими по размеру строками скорость простого сложения будет выше, чем генерация класса StringBuilder с последующими затратами на вызов методов Append и иже...
Я в курсе, и сам не буду использовать StringBuilder для получения "ab" из "a" и "b". Но вот что-то мне подсказывает, что относительно этой операции у ТС далеко и широко идущие планы.
P.S. "Небольшие" - очень относительное понятие. Недавно удивился увеличению быстродействия в своей самописной скриптовалке на основе SMO, когда заменил получение результата от StringCollection через LINQ-агрегацию (в свое время лень было сделать по-человечески) на все тот же StringBuilder. Это стало заметно даже на относительно небольших объектах - скажем, на DDL таблицы, в которой полей 20.
...
Рейтинг: 0 / 0
C# Расширяющий метод не изменяет значение вызывающей переменной.
    #38514307
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

я тож когда-то делал скриптовалку на SMO, думал один такой ненормальный :-) Скрипты к единому шаблону приводил. С добавлением везде шапки комментариев и т.д. и т.п.
...
Рейтинг: 0 / 0
C# Расширяющий метод не изменяет значение вызывающей переменной.
    #38514317
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Скрипты к единому шаблону приводил. С добавлением везде шапки комментариев и т.д. и т.п.
У нас всё хуже. В рабочей базе под сотню тысяч ХП - результат кодогенерации некоей системы. После тыка в ноду Stored Procedures в Object Explorer'е SSMS можно успеть пообедать к тому моменту, как она раскроется (как я сильно подозреваю, SSMS содержимое этой ноды тянет тоже посредством SMO). А найти в ней что-то свое нереально. Вот и пришлось написать своё.
...
Рейтинг: 0 / 0
C# Расширяющий метод не изменяет значение вызывающей переменной.
    #38514324
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Угу, SSMS дико тормозной. Несколько тысяч элементов в проекте - и он по минуте раскрывает ноды. Но у нас, конечно не сотни тысяч, поэтому минуту мы терпели :-)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# Расширяющий метод не изменяет значение вызывающей переменной.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]