0

我的问题主要集中在一件事上。在这个示例分支中,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

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

抱歉,这方面太新了,但我似乎无法理解它的作用。

此片段来自 WebMatrix2 的“Starter Site”模板中的 RegisterService.cshtml 文件。

4

2 回答 2

3

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

如果 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;
于 2013-04-01T21:35:33.573 回答
1

由于您不知道通过引用传递参数意味着什么,我将从这个开始。

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

所以如果我打电话:

a = 10;
some_func(a);

这与调用基本相同:

some_func(10);

由于您实际上发送的是 a 中包含的值,不是实际变量a

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

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

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

现在来看看refout之间的区别。

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

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

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

于 2013-04-01T21:50:43.007 回答