2015-10-03 27 views
1

我已經見過以下類型的代碼:C#方法(「項目一」 |「項目二」)的含義/執行

Method("item one" | "item two") 

究竟是什麼呢?在我的代碼中,我有。

IsInRole(RoleEnum.Administrator | RoleEnum.Moderator) 

我怎麼會希望它發生的是,它會檢查在角色管理員或版主,但它返回false,當用戶僅僅是管理員。當你這樣做時,我不確定它被稱爲什麼,但我有興趣知道它究竟做了什麼以及推理/時間可以使用類似的東西。

+2

術語 「按位或」將幫助你找到答案。它不會使用字符串。如果您對代碼無法工作的問題有疑問,請出示您的代碼。 – CodeCaster

+1

這[參考鏈接](http://www.tutorialspoint.com/csharp/csharp_bitwise_operators.htm)可能會有所幫助。 – Rohit416

回答

1

|執行輸入的按位或運算。類似地,&執行按位AND。因此,如果在一個方法,你傳遞:

  1. ((1) |(2)):呼叫將被有效地傳遞((00000001) |(00000010))=(3)
  2. ((1) &(2)):呼叫將被有效地傳遞((00000001) & (00000010))=(0)

一個常見的實例,其中它被頻繁使用且其形成計算機安全的最基本的版本是文件的權限Numeric Notation in File System Permissions本質上是使用按位與和操作來決定用戶/組對特定文件的許可。

+0

'|'也可以表示輸入的**邏輯或,儘管在這種情況下這是不太可能的。 –

+0

@ LasseV.Karlsen:我還沒有遇到過這種情況......那是哪種語言? – displayName

+1

問題中的語言,'C#'。 '|'可以對整數(按位或)和布爾(邏輯或)進行操作。在布爾操作數的情況下,'|'和'||'之間的區別是'||'會短路,這意味着如果對第一個操作數的求值是「真」,那麼就沒有必要評估第二個操作數,而'|'將始終評估兩者。 –

0

在你的情況下,答案是,不,你不能這樣做。 IPrincipal.IsInRole需要一個字符串,而不是一個枚舉值。

解決您的問題,您需要使用邏輯或操作員,以及重組這樣的電話:

IsInRole(RoleEnum.Administrator) || IsInRole(RoleEnum.Moderator) 

(假設在RoleEnum的值是字符串如果不是看到更多的結束。 info。)

那麼|算子是做什麼的?它是按位或操作符。假設我們有兩個二進制數01000010。的或操作者將它們組合,通過觀察各比特位置,並且如果任一個(或二者)爲1,則在結果相同的位置爲1。對於高於其

0100 | 
0010 = 
0110 

現代處理器的兩個數字有一些這種內置的操作員,因此這些操作速度非常快。

對於枚舉,C#允許您還指定Flags屬性,該屬性表示默認情況下,枚舉的每個成員都表示值的數字表示中的單個位。這允許對標誌進行快速組合和測試,並允許在單個標準int中存儲32個值。這是有效的,因爲所有枚舉的內部類型都是核心數字類型之一。


如果RoleEnum的值不是字符串,它是一個真正enum類型,則需要進行一些修改。爲了討論的方便,我們定義RoleEnum這樣的:

[Flags] 
public enum RoleEnum 
{ 
    Administrator, 
    Moderator, 
    User, 
    Guest, 
} 

比方說,你再有一個需要檢查用戶是否有一些角色的一個功能。它可能是這個樣子:

public bool IsInAnyRole(RoleEnum userRoles) 
{ 
    bool ok = false; 
    if (userRoles.HasFlag(RoleEnum.Administrator)) 
    { 
     ok |= IsInRole("Administrator"); 
    } 
    if (userRoles.HasFlag(RoleEnum.Moderator)) 
    { 
     ok |= IsInRole("Moderator"); 
    } 
    if (userRoles.HasFlag(RoleEnum.User)) 
    { 
     ok |= IsInRole("User"); 
    } 
    if (userRoles.HasFlag(RoleEnum.Guest)) 
    { 
     ok |= IsInRole("Guest"); 
    } 
    return ok; 
} 

(改變|=&=將改變功能成IsInAllRoles

那麼這將是可贖回的

bool inRole = IsInAnyRole(RoleEnum.Administrator | RoleEnum.Moderator);