2012-02-14 28 views
0

我想使用的樣本來自This SO article如何在C#IF語句中使用「return」這個例子?

public static bool HasWritePermissionOnDir(string path) 
{ 
    var writeAllow = false; 
    var writeDeny = false; 
    var accessControlList = Directory.GetAccessControl(path); 
    if (accessControlList == null) 
     return false; 
    var accessRules = accessControlList.GetAccessRules(true, true, typeof(System.Security.Principal.SecurityIdentifier)); 
    if (accessRules == null) 
     return false; 

    foreach (FileSystemAccessRule rule in accessRules) 
    { 
     if ((FileSystemRights.Write & rule.FileSystemRights) != FileSystemRights.Write) continue; 

     if (rule.AccessControlType == AccessControlType.Allow) 
      writeAllow = true; 
     else if (rule.AccessControlType == AccessControlType.Deny) 
      writeDeny = true; 
    } 

    return writeAllow && !writeDeny; 
} 

我如何使用 「返回writeAllow & &!writeDeny」 在if語句?或者我甚至可以這樣做。對不起,如果這是一個愚蠢的問題,但在我有限的經驗,我沒有看到這樣的回報。

+1

你沒見過的關鍵字'return'後跟體現在哪裏? '返回1 + 2;'看起來更熟悉嗎?這是同一件事。 – 2012-02-14 22:18:06

+0

或更好。 'return true && false;' – 2012-02-14 22:20:27

回答

3

這是你的意思是「在if語句中使用它」?

if (HasWritePermissionOnDir(mypath)) 
{ 
    // Then write a new file to the directory 
} 

此代碼調用與mypath功能,並根據返回的結果(這可以歸結爲writeAllow && !writeDeny),它可能會或可能不會計算爲true並執行if語句。

+0

謝謝大家。我錯過了(mypath)部分。 – JimDel 2012-02-14 22:43:45

2

在該方法結束時,評估布爾值並返回一行。但是你可以重寫它像這樣(不推薦,只是表示清晰度):

bool ValueToReturn = WriteAllow && !writeDeny; 
return ValueToReturn; 

或者,如果你想它用簡單的英語:

返回如果真write允許,而不是否認。

雙號(&)是logical short-circuit含義(在這種情況下),如果所述第一術語的計算結果爲假,則不會如果第二項不或沒有關係,因此它不會被評估。

+0

如果我碰到這段代碼,我會做的第一件事是重構'ValueToReturn'變量。我不認爲它被「用簡單的英語重寫」。 – NotMe 2012-02-14 22:22:40

+1

我也會重構它。我試圖展示return語句如何評估變量並返回結果。 (如果OP對這種工作方式感到困惑,這個問題並不完全清楚) – JYelton 2012-02-14 22:24:11

+0

非常真實。這個問題有點神祕 – NotMe 2012-02-14 22:26:31

2

writeAllow && !writeDeny退避至boolif陳述的唯一要求是圓括號內的任何內容都計算爲bool

if (writeAllow && !writeDeny) 
{ 
    //do something 
} 
2

的& &運算符是一個布爾運算符,這意味着它返回true或false:因此,使用內部的if語句的表達是那樣簡單。這意味着你可以在if語句中完全使用這個表達式:

if (writeAllow && !writeDeny) 

將工作。

2

如果我明白了,你想要把這段代碼放到你自己的函數中。那是對的嗎?

首先,我建議你把它作爲一個單獨的函數。它可以更容易地辨別出該代碼的意圖。您可以在if語句使用它:

if (HasWritePermissionOnDir("C:\\My\\Path")) 
{ 
    // TODO 
} 

或者,如果你堅持要複製代碼,內聯:

// TODO: Content of HasWritePermissionOnDir method without the return statement... 
if (WriteAllow && !writeDeny) 
{ 
    // TODO 
}