Я всегда удивляюсь, что даже после использования C # все это время мне все еще удается находить вещи, о которых я не знал ...
Я попытался поискать в интернете это, но использование «~» в поиске не работает для меня так хорошо, и я тоже не нашел ничего в MSDN (не сказать, что его там нет)
Я недавно видел этот фрагмент кода, что означает тильда (~)?
/// <summary>
/// Enumerates the ways a customer may purchase goods.
/// </summary>
[Flags]
public enum PurchaseMethod
{
All = ~0,
None = 0,
Cash = 1,
Check = 2,
CreditCard = 4
}
Я был немного удивлен, увидев это, поэтому я попытался скомпилировать его, и это сработало ... но я до сих пор не знаю, что это значит / делает. Любая помощь??
c#
enums
language-features
enumeration
Hugoware
источник
источник
Ответы:
~ - унарный оператор дополнения - он переворачивает биты своего операнда.
в дополнении к двум арифметическим,
~x == -x-1
Оператор ~ можно найти практически на любом языке, который позаимствовал синтаксис у C, включая Objective-C / C ++ / C # / Java / Javascript.
источник
Я думаю, что:
Было бы немного яснее.
источник
Из-за двух дополнений в C #,
~0 == -1
число, где все биты равны 1 в двоичном представлении.источник
Лучше чем
решение, потому что если вы добавите другой метод позже, скажите:
Вы уже закончили с тильдой-Все, но должны изменить всю линию с другой. Таким образом, его менее подвержен ошибкам позже.
С уважением
источник
Просто примечание, когда вы используете
у вас есть дополнительное преимущество,
Cash | Check | CreditCard
которое оцениваетAll
и не оценивает другое значение (-1), которое не равно всем, в то время как содержит все значения. Например, если вы используете три флажка в пользовательском интерфейсеи суммировать их значения, и пользователь выбирает их все, что вы увидите
All
в результирующем перечислении.источник
myEnum.HasFlag()
вместо: DAll.HasFlag(Cash | Check | CreditCard)
и это будет означать истину. Был бы обходной путь, так==
как не всегда работает с ~ 0.ToString
не об использовании== All
.Для тех, кто нашел этот вопрос осветительным, у меня есть небольшой
~
пример, которым можно поделиться. Следующий фрагмент из реализации метода рисования, который подробно описан в этой документации Mono , использует~
с большим эффектом:Без
~
оператора код, вероятно, будет выглядеть примерно так:... потому что перечисление выглядит так:
Заметили сходство этого перечисления с ответом Шона Брайта?
Я думаю, что самый важный вывод для меня - это
~
тот же оператор в перечислении, что и в обычной строке кода.источник
&
быть|
s?Это оператор дополнения. Вот статья, к которой я часто обращаюсь для побитовых операторов.
http://www.blackwasp.co.uk/CSharpLogicalBitwiseOps.aspx
Также msdn использует это в своей статье enums, которая демонстрирует, как лучше использовать
http://msdn.microsoft.com/en-us/library/cc138362.aspx
источник
Лично я использую альтернативу, которая делает то же самое, что и ответ @Sean Bright, но для меня выглядит лучше:
Обратите внимание , как бинарная природа этих чисел, которые все силы два, делает следующее утверждение верно:
(a + b + c) == (a | b | c)
. И ИМХО,+
выглядит лучше.источник
Я провел некоторые эксперименты с ~ и обнаружил, что у него могут быть подводные камни. Рассмотрим этот фрагмент для LINQPad, который показывает, что значение перечисления All не ведет себя должным образом, когда все значения объединены вместе.
источник
Просто хочу добавить, что если вы используете перечисление [Flags], то может быть удобнее использовать побитовый оператор сдвига влево, например:
источник