我有一些python初始化器的背景(本质上是python对象构造函数语法),在python中实例化对象的语法如下:
class Account:
def __init__(self,name=None,address="Not Supplied",balance=0.0):
this.name = name
this.address=address
this.balance=balance
为什么在C#中,我必须在构造函数方法的主体中提供默认值,而在python中,我可以将它们声明为可选值,并且默认值会被传递(请参阅__init__
的签名):
public class Account
{
private string name;
private string address;
private decimal balance;
public Account (string inName, string inAddress, decimal inBalance)
{
name = inName;
address = inAddress;
balance = inBalance;
}
public Account (string inName, string inAddress)
{
name = inName;
address = inAddress;
balance = 0;
}
public Account (string inName)
{
name = inName;
address = "Not Supplied";
balance = 0;
}
}
为什么我不能在C#中执行以下操作?
public class Account
{
private string name;
private string address;
private decimal balance;
public Account (string inName, string inAddress="not supplied", decimal inBalance=0;)
{
name = inName;
address = inAddress;
balance = inBalance;
}
C#中的构造函数语法是否可能与Python的初始值设定项语法相似(如果不是完全重复的话)?
这是使用命名和可选参数(C#编程指南)完成的
Visual C#2010引入了命名参数和可选参数。命名参数使您能够为特定参数指定参数通过将参数与参数的名称相关联,而不是与参数在参数列表中的位置可选参数使您可以省略某些参数的参数两种技术可以与方法、索引器、构造函数和委托一起使用。
方法、构造函数、索引器或委托的定义可以指定其参数是必需的或是可选的。任何调用都必须为所有必需的参数提供参数,但可以省略可选参数的参数。
每个可选参数都有一个默认值作为其定义的一部分。如果没有为该参数发送参数,则使用默认值。
您应该研究构造函数链接。基本上可以归结为构造函数调用其他构造函数以避免重复代码。
我用C#和Python编程,所以这里有一个最近从C#转到Python的人的视图:
如果不创建默认构造函数,C#将提供一个默认构造函数。
因此,默认情况下(如果您还没有构造函数),您可以使用如下默认值实例化对象:
var Account = new Account();
这将用它们各自的默认值实例化这些属性。
如果你提供了一个构造函数,那么你也必须提供默认的构造函数(如果你只想通过:var account = new Account();
:来构造一个对象
public Account() {} //default constructor
public Account(string name)
{
Name = name;
}
类中的其他基元类型将根据它们的默认值进行初始化。
如果你想要Python的东西,你需要确保你使用的是C#4.0;我们称之为可选参数。它们的用法(在你的情况下)将与你写的一模一样:
public string Name { get; set;}
public string Address {get; set;}
public decimal Balance {get; set;}
public Account (string name, string address="not supplied", decimal balance=0;)
{
Name = name;
Address = address;
Balance = balance;
}
一些风格评论:
在C#中,我们使用属性。它们在Python中的使用方式并不完全相同,在Python中您更可能使用字段。我们的房产是PascalCased。
我们不使用'in'和'out'参数作为参数名称的一部分(没有必要,当我们需要传递引用时,我们有
ref
和out
——遗憾的是,Python中缺少了这两个参数(尽管这并不是很遗憾,因为它使代码更复杂)。在C#中,字段的大小写为Camel,或者
camelCased
。在Python中,它们遵循Unix约定:first_name
,而不是firstName。在C#中,默认情况下,您的属性是
public
,它们应该是。在Python中,每个人都假设public
,只有在变量前面有下划线时才假设private
,而在C#中则不然。
如果您想要一种更简单的方法,可以使用对象初始值设定项。
public class Account
{
public string Name { get; set; }
public string Address { get; set; }
public decimal Balance { get; set; }
}
var account = new Account { Name = "Dave" };
从VS2010(我相信C#4.0)起,C#确实允许命名和可选参数,类似于在Python中使用它们的方式。
不幸的是,旧版本的C#没有这个功能(我认为这在一定程度上是由于C#的Java遗留问题,但这只是我的猜测)。
C#还允许您使用对象初始化器:
public class Account
{
public string name { get; set;}
public string address { get; set;}
public decimal balance { get; set;}
}
Account acc = new Account () { name="Some Name", address="Some Address", balance=10.0 }
通过这种方式,可以动态指定要初始化的字段。