Я всегда удивляюсь, что даже после использования 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
}
Я был немного удивлен, увидев его, поэтому я попытался скомпилировать его, и это сработало ... но я до сих пор не знаю, что это значит / делает. Любая помощь?
~ является унарным оператором поразрядного дополнения до единицы - это зеркально отражает биты своего операнда.
~0 = 0xFFFFFFFF = -1
в дополнительной арифметике two, ~x == -x-1
~ оператор может быть найден на в значительной степени любом языке, который одолжил синтаксис у C, включая Objective-C/C ++/C#/Java/Javascript.
Я думал бы что:
[Flags]
public enum PurchaseMethod
{
None = 0,
Cash = 1,
Check = 2,
CreditCard = 4,
All = Cash | Check | CreditCard
}
было бы немного более ясным.
Это - дополнительный оператор, Вот статья, к которой я часто обращаюсь для побитовых операторов
http://www.blackwasp.co.uk/CSharpLogicalBitwiseOps.aspx
, Также MSDN использует его в их статье перечислений, которая демонстрирует, что это использует лучше
public enum PurchaseMethod
{
All = ~0, // all bits of All are 1. the ~ operator just inverts bits
None = 0,
Cash = 1,
Check = 2,
CreditCard = 4
}
из-за двух дополнений в C#, ~0 == -1
, число, где все биты 1 в двоичном представлении.
Лучше, чем
All = Cash | Check | CreditCard
решение, потому что, если Вы добавляете другой метод позже, скажите:
PayPal = 8 ,
Вы будете уже сделаны с тильдой - все, но иметь для изменения все-строки с другим. Так его менее подверженное ошибкам позже.
отношения
Просто примечание стороны, когда Вы используете
All = Cash | Check | CreditCard
, Вы обладаете дополнительным преимуществом, которое Cash | Check | CreditCard
оценило бы к All
а не к другому значению (-1), который не равен всем в то время как содержащий все значения. Например, если Вы используете три флажка в UI
[] Cash
[] Check
[] CreditCard
и суммируете их значения, и пользователь выбирает их всех, Вы видели бы All
в получающемся перечислении.
os.geteuid()
часть? И можно ли дать пример (примеры), чтобы показать, что и не то же т.е. , x может быть достигнут только с getuid и не geteuid, и , y может только быть достигнут только с geteuid и не getuid?
– Santosh Kumar
01.04.2020, 01:27
ToString
- не об использовании == All
.
– configurator
20.05.2020, 03:21
All.HasFlag(Cash | Check | CreditCard)
, и это оценит к истинному. Было бы обходное решение с тех пор ==
doesn' t всегда работают с ~0.
– Pyritie
20.05.2020, 03:21