在 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 表达式等时变得非常有用
我看到了这段代码,但我不知道它是什么或目的是什么。
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 表达式等时变得非常有用