Подтвердить что ты не робот

Изменить метод ValueType из метода расширения?

Несколько дней назад мне нужно было переключить bool, и я закончил так:

IsVisible = !IsVisible;

Я обнаружил, что это самый простой способ архивирования этой функции. Но прежде чем делать пример выше, я попробовал несколько способов.

В основном об использовании метода расширения. Который, по моему мнению, сделает его еще проще или, по крайней мере, меньше символов для написания.

IsVisible.toggle();

Но поскольку логическое значение является типом значения, bool, который отправляется хотя бы на метод расширения, является копией исходного bool, а не ссылочным типом.

public static void Toggle(this boolean value)
{
value = !value;
}

Что будет делать то, что мне нужно, но поскольку логическое значение, которое нужно переключить, является копией исходного логического значения, это изменение не применяется к оригиналу.

Я попытался поставить ключевое слово ref infront из "boolean", но это не скомпилировалось. И я до сих пор не нашел причины для того, чтобы не компилировать, разве это не идеальная функциональность для методов расширения?

public static void Toggle(this ref boolean value)

Я даже попробовал кастинг булевых в объект, который в моей голове превратил бы его в ссылочный тип, а затем он больше не будет копией, и изменение будет передано обратно. Это тоже не сработало.

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

Я знаю, что это вполне возможно, не будет более простым или логичным, чем верхний пример, но вы никогда не знаете:)

Спасибо заранее.

4b9b3361

Ответ 1

Примитивные типы неизменяемы. Вам нужно будет написать свой код вызова следующим образом:

IsVisible = IsVisible.Toggle();

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

Ответ 2

в качестве стороннего: не будет ли метод расширения невероятным накладным капиталом для чего-то столь же простого, как переключение bool?

Ответ 3

В vb.net методы расширения могут быть объявлены для принятия подразумеваемого "this" как параметра ByRef (эквивалентного ref в С#). Такие методы работают так, как можно было бы ожидать, но из-за неудачного факта, что вызов такого метода расширения для чего-то другого, кроме изменчивого места хранения (например, для значения свойства, места для хранения только для чтения и т.д.), Заставит компилятор молча передать ссылку на копия параметра, а не выдача ошибки компиляции [глупое поведение, учитывая, что в 90% случаев вся точка использования параметра ref должна была бы модифицировать его на сайте вызова]. К сожалению, хотя С#, как правило, может использовать методы расширения, написанные на vb, он не позволит передавать параметры ref без ключевого слова ref и не предоставляет законного способа указания ref, кроме случаев использования static- синтаксис функции-вызова.