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关键字声明这个变量,让编译器知道这个变量只是一个输出,因此不需要检查它是否已经初始化