나는 지금까지 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
2의 보수 산술에서 ~x == -x-1
~ 연산자는 Objective-C / C ++ / C # / Java / Javascript를 포함하여 C에서 구문을 빌린 거의 모든 언어에서 찾을 수 있습니다.
답변
나는 그렇게 생각할 것이다 :
[Flags]
public enum PurchaseMethod
{
None = 0,
Cash = 1,
Check = 2,
CreditCard = 4,
All = Cash | Check | CreditCard
}
좀 더 명확 할 것입니다.
답변
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 #의 2 개의 보수 ~0 == -1
로 인해 이진 표현에서 모든 비트가 1 인 숫자입니다.
답변
그것보다 낫다
All = Cash | Check | CreditCard
나중에 다른 방법을 추가하면 다음과 같이 말합니다.
PayPal = 8 ,
당신은 이미 물결표로 끝났지 만, 모든 줄을 다른 줄로 바꿔야합니다. 나중에 오류가 발생하기 쉽습니다.
문안 인사
답변
사용시 참고 사항
All = Cash | Check | CreditCard
모든 값을 포함하면서 모든 값과 같지 않은 다른 값 (-1)으로 Cash | Check | CreditCard
평가하거나 평가 All
하지 않는 추가 이점이 있습니다. 예를 들어 UI에서 3 개의 확인란을 사용하는 경우
[] Cash
[] Check
[] CreditCard
값을 합산하면 사용자가 모든 값을 선택 All
하면 결과 열거 형에 표시됩니다.
답변
이 질문을 밝히는 다른 사람들을 위해, 나는 ~
공유 할 빠른 예가 있습니다. 에 설명 된대로 페인트 메소드의 구현에서 다음 코드는 이 모노 문서 , 사용하는 ~
큰 효과를 :
PaintCells (clipBounds,
DataGridViewPaintParts.All & ~DataGridViewPaintParts.SelectionBackground);
~
연산자가 없으면 코드는 다음과 같이 보일 것입니다.
PaintCells (clipBounds, DataGridViewPaintParts.Background
| DataGridViewPaintParts.Border
| DataGridViewPaintParts.ContentBackground
| DataGridViewPaintParts.ContentForeground
| DataGridViewPaintParts.ErrorIcon
| DataGridViewPaintParts.Focus);
… 열거 형이 다음과 같기 때문에 :
public enum DataGridViewPaintParts
{
None = 0,
Background = 1,
Border = 2,
ContentBackground = 4,
ContentForeground = 8,
ErrorIcon = 16,
Focus = 32,
SelectionBackground = 64,
All = 127 // which is equal to Background | Border | ... | Focus
}
이 열거 형이 Sean Bright의 답변과 유사합니까?
필자가 가장 중요하게 생각하는 것은 ~
일반적인 코드 줄과 동일한 열거 형 연산자입니다.
답변
그것은 보완 연산자입니다, 여기 비트 연산자에 대해 종종 언급하는 기사가 있습니다.
http://www.blackwasp.co.uk/CSharpLogicalBitwiseOps.aspx
또한 msdn은 enums 기사에서 더 잘 사용한다는 것을 보여줍니다.