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

the purpose of using {} after class type c#

我看到了这段代码,但我不知道它是什么或目的是什么。

Class一个

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; }
}

Class 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; }
}

所以这是我不明白的部分。

var requestObj = new RequestBase<AuthenicateRequest>
                {
                Method = "auth.accessToken",
                Parameters = new AuthenicateRequest
                        {
                        APIKey = api_key,
                        SecretKey = secret_key
                        }
                };

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

Q2:为什么发起 Parameters = new AuthenicateRequest { APIKey = api_key, SecretKey = secret_key } 而不是 Parameters = new AuthenicateRequest(api_key, secret_key) ?

我还有更多问题要问,但我想我最好把它放在一个单独的地方 post。

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

参见: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
                        }
                };

完全等同于:

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

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

var x = new Foo(someParam) {
            SomeProperty = "foobar",
            OtherProperty = 4
        };

相同
var x = new Foo(someParam);
x.SomeProperty = "foobar";
x.OtherProperty = 4;

Object and Collection Initializers (C# Programming Guide)

Object initializers let you assign values to any accessible fields or properties of an object at creation time without having to invoke a constructor followed by lines of assignment statements. The object initializer syntax enables you to specify arguments for a constructor or omit the arguments (and parentheses syntax).

样本Class:

class Cat
{
    public int Age { get; set; }
    public string Name { get; set; }
}

使用对象初始化器进行初始化:

Cat cat = new Cat { Age = 10, Name = "Fluffy" };

手动初始化:

Cat cat = new Cat();
cat.Age = 10;
cat.Name = "Fluffy";

为什么要使用对象初始化器?

  • 有时没有其他办法,例如初始化匿名类型时。
  • 它防止构造函数有很多重载
  • 有时它使代码更具可读性。

Parameters = new AuthenicateRequest { APIKey = api_key, SecretKey = secret_key }这样的构造只是更短的写法

var param = new Parameters();
param.APIKey = api_key;
param.SecretKey = secret_key;

这称为对象初始化器

您正在使用的功能称为 object initializers.

问题 1 的答案: 这正是对象初始化程序的本质。你可以想象编译器翻译 var request = new AuthenticateRequest { APIKey = api_key, SecretKey = secret_key }; 进入 var request = new AuthenticateRequest(); request.APIKey = api_key; request.SecretKey = secret_key;

问题 2 的回答:如果您有适合您需要的可用构造函数,那么使用对象初始值设定项就没有意义。那你就用那个吧。

在实例化对象时使用大括号 ({,}) 允许您为该对象的属性提供值。所以这段代码:

    var authRequest = new AuthenicateRequest
                    {
                    APIKey = api_key,
                    SecretKey = secret_key
                    }

在功能上等同于:

    var authRequest = new AuthenicateRequest();
    authRequest.APIKey = api_key;
    authRequest.SecretKey = secret_key;

要对此进行扩展,您可以像问题中的示例一样嵌套对象创建:

    var requestObj = new RequestBase<AuthenicateRequest>
    {
        Method = "auth.accessToken",
        Parameters = new AuthenicateRequest
            {
                APIKey = api_key,
                SecretKey = secret_key
            }
     };

相当于:

    var authRequest = new AuthenicateRequest();
    authRequest.APIKey = api_key;
    authRequest.SecretKey = secret_key;

    var requestObj = new RequestBase<AuthenicateRequest>();
    requestObj.Method = "auth.accessToken";
    requestObj.Parameters = authRequest;

如果对象有参数化构造函数,您仍然可以使用它们 - 例如:

    MyObject obj = new MyObject("hello") {
                       String2 = "world"
                   };

这种语法在使用 lambda 表达式等时变得非常有用