2013-04-01 50 views
0

我的問題的確主要集中在一件事情上。 out關鍵字在這個示例分支中究竟做了什麼?這個「if」分支(在WebMatrix的OAuth「入門網站」模板中使用)中的「out」關鍵字的用途是什麼?

if (!OAuthWebSecurity.TryDeserializeProviderUserId(loginData, out provider, out providerUserId)) { 
      Response.Redirect("~/Account/Manage"); 
      return; 
     } 

我已經在這裏看了:http://msdn.microsoft.com/en-us/library/t3c3bfhx(v=vs.80).aspx

但事實是,我不知道什麼是「按引用傳遞參數」是指比了,我知道了「裁判」的關鍵字是什麼/做。

對不起,這方面很新穎,但我似乎無法將我的頭圍繞在這件事上。

該代碼片段來自WebMatrix2的「Starter Site」模板中的RegisterService.cshtml文件。

+0

我意識到這個問題與其他幾個問題非常接近,但我覺得這些問題中的兩個OP都比我更瞭解它,而且我不能真正理解這些問題的本質。 '爲什麼有人會用掉/ ref – VoidKing

+1

你可能想閱讀Jon Skeet的[參數在C#中傳遞](http://www.yoda.arachsys.com/csharp/parameters.html) –

回答

2

這意味着這些參數是該程序的輸出。這是從程序中「返回」多個值而不創建類來存儲結果的一種方法。在這種情況下,有三個「結果」(兩個參數加上真布爾返回值)。

如果C#允許多個返回值將是等價的:

bool canDeserialize; 
canDeserialize, provider, providerUserId = OAuthWebSecurity.TryDeserializeProviderUserId(loginData); 
if (!canDeserialize){ 
      Response.Redirect("~/Account/Manage"); 
      return; 
     } 

另一種選擇是有效的C#是創建一個類來保存結果:

public class ProviderParseResults 
{ 
    public string Provider {get; set;} 
    public string ProviderUserId {get; set;} 
} 

,然後這樣使用它:

ProviderParseResults results = OAuthWebSecurity.TryDeserializeProviderUserId(loginData); 
if (results == null){ 
      Response.Redirect("~/Account/Manage"); 
      return; 
     } 

string provider = results.Provider; 
string providerUserId = results.ProviderUserId; 
+0

另外,'out 'keywor d指定必須在離開方法主體之前分配變量**。而'ref'不強制這個要求。 –

+0

輸出什麼程序?該方法調用自己?所以,不是傳入變量,而是在方法執行後將它們取出。我認爲我沒有把握得很好嗎? – VoidKing

+0

從技術上講,你仍然可以將'out'值傳遞給方法本身;只需要該方法爲它們分配一個值。同樣,'ref'可以很容易地返回值,不同的是它不需要在方法中賦值。 –

1

既然你不知道通過引用傳遞參數意味着什麼, rt與此。

通常,當調用一個函數時,你會這樣做,通過值傳遞參數。這意味着您將值作爲參數發送,而不是變量。

所以,如果我打電話:

a = 10; 
some_func(a); 

這基本上等同於調用:

some_func(10); 

因爲實際上發送在含有,而不是實際的變量一個值。

但是,如果你想讓你的函數實際改變a的值?在這種情況下,您需要將函數的參數作爲參考發送,以便將變量本身提供給函數。這裏是一個例子:

void sum(int a, int b, ref int c) 
{ 
    c = a + b; 
} 

正如你在上面的函數中看到的,函數接收a和b的值,因爲它不打算改變它們。但是c是通過引用傳遞的,因爲我們打算把函數的結果放在這個變量中。

現在到ref的差額

如果您嘗試調用上述函數,您可能會收到一個編譯錯誤,告訴您發送一個未初始化的變量給該函數。

但是,這不應該是一個問題(在這種情況下),因爲我引用的變量實際上是一個輸出,所以我並不在乎之前存儲的值是什麼。

所以不是聲明這個變量與裁判關鍵字,我可以用關鍵字,它可以讓編譯器知道這個變量是唯一的輸出,所以它並不需要檢查它是否已初始化

+0

令人驚歎的答案! (不是說D斯坦利的不是)所以,如果我使用ref,我將不得不聲明它,從而建立一些價值,我可以在方法中引用和操縱一個值,但是除了我不需要聲明什麼,因爲我不會引用一個值,只是設置它然後傳遞出去? – VoidKing

+0

您需要在兩種情況下聲明您正在發送的變量(通過引用)。區別在於,使用out關鍵字時,變量可以是未初始化的,這意味着在將它傳遞給函數之前,您不關心其中的初始值 –

相關問題