📅  最后修改于: 2023-12-03 15:14:36.532000             🧑  作者: Mango
在 Dart 和 C# 中,构造函数都是用于初始化新对象的特殊方法。虽然它们的基本概念相似,但这两种语言中的构造函数有着一些不同之处。
Dart 中的构造函数是在类名中声明的特殊方法。在构造函数中,我们可以初始化成员变量并执行其他初始化操作。Dart 中的构造函数有如下几种类型:
默认构造函数是在类名后面不跟任何参数列表的构造函数。如果我们没有手动声明任何构造函数,则默认会生成一个无参数的构造函数。默认构造函数可以用下面这种方式来声明:
class Person {
String name;
int age;
Person();
}
命名构造函数是指在类中通过指定函数名来实现的构造函数。命名构造函数是为了提供更多的初始化方式。我们可以通过创建不同的命名构造函数来提供不同的初始化函数,以便初始化同一个类的对象。
class Person {
String name;
int age;
Person(this.name, this.age);
Person.fromName(String name) {
this.name = name;
}
Person.fromAge(int age) {
this.age = age;
}
}
在上面的示例中,我们为 Person
类定义了三种不同的构造函数。第一个构造函数是默认构造函数,它需要传入 name
和 age
参数来初始化成员变量。第二个和第三个构造函数都是命名构造函数,它们都有一个单独的参数用来初始化 name
和 age
中的一个。
使用工厂构造函数可以拥有更细粒度的控制,可以自定义构造返回的实例。除此之外,还可以利用工厂构造函数创建单例对象。
class Person {
String name;
int age;
Person(this.name, this.age);
factory Person.fromMap(Map<String, dynamic> map) {
return Person(
map['name'],
map['age'],
);
}
static final Person _singleton = Person('张三', 18);
factory Person.singleton() => _singleton;
}
在上面的示例中,我们为 Person
类定义了两种工厂构造函数。第一个工厂构造函数是 fromMap
,它接受一个 Map<String, dynamic>
类型的参数,并将其中的 name
和 age
映射到 Person
的属性中。第二个工厂构造函数是 singleton
,它返回一个单例对象。
C# 中的构造函数也是在类中声明的特殊方法。C# 中的构造函数可以包含许多不同类型的参数,如下所示:
无参数构造函数是默认构造函数,它是一个无参构造函数。如果没有手动声明构造函数,则默认会生成一个无参数的构造函数。
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person() { }
}
常规构造函数是最常见的构造函数类型,它可以包含多个参数,并用来初始化对象的成员变量。
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
}
可选参数构造函数可以包含一些有默认值的参数。如果我们不想为这些参数指定值,那么它们将被初始化为默认值。
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string Address { get; set; }
public Person(string name, int age, string address = "")
{
Name = name;
Age = age;
Address = address;
}
}
在上面的示例中,Address
参数被设置为可选参数,并且没有传入值时将被初始化为空字符串。
总的来说,在 Dart 和 C# 中,我们都可以通过构造函数来初始化新对象。虽然这两个语言中的构造函数存在一些区别,但它们的基本概念是相似的。