2014-01-08 100 views
1

我想明白以下代码的含义是:了解这个C#代码

flow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer 
    { 
    DataStore = new FileDataStore("Tasks.ASP.NET.Sample.Store"), 
    ClientSecretsStream = stream, 
    Scopes = new[] { TasksService.Scope.TasksReadonly } 
    }); 

从我的理解,之间的代码的第一个和最后{...}是匿名函数体。新的FileDataStore创建一个FileDataStore的新实例。我不明白的是它最后的逗号意味着什么。接下来的两行最后也有逗号。这在C#中调用了什么样的构造?我不熟悉它。

+6

这叫做[* Object initializer *](http://msdn.microsoft.com/en-us/library/bb384062.aspx) –

回答

10

不,它不是匿名函数的主体。它是一个初始化列表 ..它用于设置类型为GoogleAuthorizationCodeFlow.Initializer的新对象的所有内联字段。

正是这样做的“在线”版:

var initializer = new GoogleAuthorizationCodeFlow.Initializer(); 
initializer.DataStore = new FileDataStore("Tasks.ASP.NET.Sample.Store"); 
initializer.ClientSecretsStream = stream; 
initializer.Scopes = new[] { TasksService.Scope.TasksReadonly }; 

flow = new GoogleAuthorizationCodeFlow(initializer); 

两者是等同的功能。它只是更紧凑。

+0

你上面写的是我更熟悉的东西。内嵌引入了什么版本的C#?任何想法?我不记得它在早期版本中。我其实喜欢更长的方法。更容易在眼睛上:-) – AndroidDev

+0

@AndroidDev对象和集合初始值设定项是在[C#3.0](http://msdn.microsoft.com/en-us/library/bb308966.aspx)(2007年3月)中引入的。 –

4

这是一个构造函数初始值设定项。 该代码是创建一个新GoogleAuthorizationCodeFlow.Initializer对象,和对象上设置DataStoreClientSecretsStreamScopes性质。

然后将其作为参数传递给GoogleAuthorizationCodeFlow构造函数。

0

你有一个类Sample。

public class Sample() 
{ 
    public string id { get; set; } 
    public int key { get; set; } 
} 

这可以被初始化为

var sample = new Sample {id = 1, key = "one"}; 

然后通过这sample作为参数。

在你的例子中,他们对参数做了同样的事情。这被称为类初始化器。

希望它有帮助。

+0

这和你可以在构造函数中使用参数的类构造函数是一样的吗? – AndroidDev

+0

在你的例子中'GoogleAuthorizationCodeFlow'构造函数需要一个'GoogleAuthorizationCodeFlow.Initializer'对象/类的实例。正如我看到'GoogleAuthorizationCodeFlow.Initializer'有一个参数少的构造函数。您的代码片段使用类初始化程序创建类实例并将其作为参数传递。希望现在很清楚。 – Sandy