关于C#:这个”if”分支中的”out”关键字的用途是什么(用于webmatrix的OAuth”starter site”模板)?

What is the purpose of the “out” keyword in this “if” branch (used in OAuth “Starter Site” template for WebMatrix)?

本问题已经有最佳答案,请猛点这里访问。

我的问题主要集中在一件事上。在这个示例分支中,out关键字的作用是什么?

1
2
3
4
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

但事实是,我不知道"引用传递的参数"是什么意思,我不知道"ref"关键字是/做什么。

很抱歉,这方面还不太熟悉,但我似乎无法理解这一点。

此代码段来自WebMatrix2的"starter site"模板中的registerservice.cshtml文件。


这意味着这些参数是过程的输出。这是从一个过程中"返回"多个值而不创建存储结果的类的一种方法。在这种情况下,有三个"结果"(两个参数加上真正的布尔返回值)。

如果c允许多个返回值,则等于:

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

另一个在C中有效的选项是创建一个类来存储结果:

1
2
3
4
5
public class ProviderParseResults
{
   public string Provider {get; set;}
   public string ProviderUserId {get; set;}
}

然后用这种方法:

1
2
3
4
5
6
7
8
ProviderParseResults results = OAuthWebSecurity.TryDeserializeProviderUserId(loginData);
if (results == null){
            Response.Redirect("~/Account/Manage");
            return;
        }

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


既然你不知道引用传递参数意味着什么,我就从这个开始。

通常,在调用函数时,您将按值传递参数。这意味着您将值作为参数发送,而不是变量。

所以如果我打电话:

1
2
a = 10;
some_func(a);

基本上和打电话一样:

1
some_func(10);

因为您实际发送的是a中包含的值,而不是实际变量a。

但是,如果您希望函数实际更改a中的值呢?在这种情况下,需要将函数的参数作为引用发送,以便将变量本身提供给函数。下面是一个例子:

1
2
3
4
void sum( int a, int b, ref int c )
{
    c = a + b;
}

正如您在上面的函数中看到的,函数按值接收A和B,因为它不打算更改它们。但是C是通过引用传递的,因为我们打算将函数的结果放入这个变量中。

现在看看裁判和出局的区别。

如果尝试调用上面的函数,可能会收到一个编译错误,告诉您正在向函数发送一个未初始化的变量。

但这不应该是一个问题(在本例中),因为我引用的变量实际上是一个输出,所以我并不真正关心存储在其中的前一个值是什么。

因此,我可以使用out关键字而不是用ref关键字声明这个变量,让编译器知道这个变量只是一个输出,因此不需要检查它是否已经初始化