在类类型c#之后使用{}的目的

Pho*_*nic 1 c# class curly-braces

我遇到了这个代码,我不知道它是什么或目的是什么.

A级

internal class RequestBase<T>
{
    public RequestBase()
    {
        ID = Helper.GetNextId().ToString(CultureInfo.InvariantCulture);
    }
    public RequestBase(string method, T @params)
        : this()
    {
        Method = method;
        Parameters = @params;
    }

    [DataMember(Name = "id")]
    public string ID { get; private set; }

    [DataMember(Name = "method")]
    public string Method { get; set; }

    [DataMember(Name = "params")]
    public T Parameters { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

B级

[DataContract]
internal class AuthenicateRequest
{
    [DataMember(Name = "api_key", IsRequired = true)]
    public string APIKey { get; set; }

    [DataMember(Name = "secret_key", IsRequired = true)]
    public string SecretKey { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

所以这是我不理解的部分.

var requestObj = new RequestBase<AuthenicateRequest>
                {
                Method = "auth.accessToken",
                Parameters = new AuthenicateRequest
                        {
                        APIKey = api_key,
                        SecretKey = secret_key
                        }
                };
Run Code Online (Sandbox Code Playgroud)

Q1:在参数部分中,如何在不执行ClassB.APIKey = api_key的情况下将api_key传递给ClassB APIKey?

Q2:为什么要启动Parameters = new AuthenicateRequest {APIKey = api_key,SecretKey = secret_key}而不是参数= new AuthenicateRequest(api_key,secret_key)?

我有更多问题要问,但我想我最好把它放在一个单独的帖子中.

sir*_*ide 5

这些被称为对象初始化器.它们允许您使用更简洁的语法设置新构造的对象的属性.它们的行为与构造新对象完全相同,然后将这些属性逐个设置为新语句.

请参阅:https://msdn.microsoft.com/en-us/library/bb384062.aspx

这个:

var requestObj = new RequestBase<AuthenicateRequest>
                {
                Method = "auth.accessToken",
                Parameters = new AuthenicateRequest
                        {
                        APIKey = api_key,
                        SecretKey = secret_key
                        }
                };
Run Code Online (Sandbox Code Playgroud)

完全等同于:

var requestObj = new RequestBase<AuthenicateRequest>();
requestObj.Method = "auth.accessToken";
requestObj.Parameters = new AuthenticateRequest();
requestObj.Parameters.APIKey = api_key;
requestObj.Parameters.SecretKey = secret_key;
Run Code Online (Sandbox Code Playgroud)

请注意,如果构造函数需要参数,则无论使用哪种语法,都必须在括号内指定这些参数,例如:

var x = new Foo(someParam) {
            SomeProperty = "foobar",
            OtherProperty = 4
        };
Run Code Online (Sandbox Code Playgroud)

这是一样的

var x = new Foo(someParam);
x.SomeProperty = "foobar";
x.OtherProperty = 4;
Run Code Online (Sandbox Code Playgroud)