如何使C#构造函数语法更加pythonic?

Jac*_*des 1 c# python constructor default-constructor object-initialization

我在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
Run Code Online (Sandbox Code Playgroud)

为什么,在C#中,我必须提供默认的构造函数方法的机构,在蟒蛇的时候,我可以声明为可选的,默认值是在通过(见__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;
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么我不能在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; 
    }
Run Code Online (Sandbox Code Playgroud)

是否有可能在C#中使用与Python的初始化语法类似(如果不是完全重复)的构造函数语法?

Adr*_*der 6

这是使用Named和Optional Arguments(C#编程指南)完成的

Visual C#2010引入了命名和可选参数.命名参数使您可以通过将参数与参数的名称相关联而不是参数列表中的参数位置来为特定参数指定参数.可选参数使您可以省略某些参数的参数.这两种技术都可以与方法,索引器,构造函数和委托一起使用.

方法,构造函数,索引器或委托的定义可以指定其参数是必需的,还是可选的.任何调用都必须为所有必需参数提供参数,但可以省略可选参数的参数.

每个可选参数都有一个默认值作为其定义的一部分.如果没有为该参数发送参数,则使用默认值.


bas*_*her 5

您应该查看构造函数链接。基本上归结为构造函数调用其他构造函数以避免重复代码。