[C#] 열거 형 정의에서 물결표 (~)는 무엇입니까?

나는 지금까지 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 기사에서 더 잘 사용한다는 것을 보여줍니다.

http://msdn.microsoft.com/en-us/library/cc138362.aspx