Ответ 1
Примитивные типы неизменяемы. Вам нужно будет написать свой код вызова следующим образом:
IsVisible = IsVisible.Toggle();
Это лучшее, что вы можете сделать с помощью методов расширения. Никоим образом не вокруг.
Несколько дней назад мне нужно было переключить 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)
Я даже попробовал кастинг булевых в объект, который в моей голове превратил бы его в ссылочный тип, а затем он больше не будет копией, и изменение будет передано обратно. Это тоже не сработало.
Итак, мой вопрос заключается в том, можно ли сделать расширение обратно обратно, или другой способ сделать его еще проще, чем он уже есть?
Я знаю, что это вполне возможно, не будет более простым или логичным, чем верхний пример, но вы никогда не знаете:)
Спасибо заранее.
Примитивные типы неизменяемы. Вам нужно будет написать свой код вызова следующим образом:
IsVisible = IsVisible.Toggle();
Это лучшее, что вы можете сделать с помощью методов расширения. Никоим образом не вокруг.
в качестве стороннего: не будет ли метод расширения невероятным накладным капиталом для чего-то столь же простого, как переключение bool?
В vb.net методы расширения могут быть объявлены для принятия подразумеваемого "this" как параметра ByRef
(эквивалентного ref
в С#). Такие методы работают так, как можно было бы ожидать, но из-за неудачного факта, что вызов такого метода расширения для чего-то другого, кроме изменчивого места хранения (например, для значения свойства, места для хранения только для чтения и т.д.), Заставит компилятор молча передать ссылку на копия параметра, а не выдача ошибки компиляции [глупое поведение, учитывая, что в 90% случаев вся точка использования параметра ref
должна была бы модифицировать его на сайте вызова]. К сожалению, хотя С#, как правило, может использовать методы расширения, написанные на vb, он не позволит передавать параметры ref
без ключевого слова ref
и не предоставляет законного способа указания ref
, кроме случаев использования static- синтаксис функции-вызова.