创建对象的最佳方式

Dev*_*evT 25 .net c# oop constructor instance

这似乎是非常愚蠢和基本的问题,但我试图谷歌它,但无法找到一个满意的答案,

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public Person(){}
    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
    //Other properties, methods, events...
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我有这样的课程,创建对象的最佳方法是什么?

Person p=new Person("abc",15)
Run Code Online (Sandbox Code Playgroud)

要么

Person p=new Person();
p.Name="abc";
p.Age=15;
Run Code Online (Sandbox Code Playgroud)

这两种方法有什么区别,创建对象的最佳方法是什么?

dav*_*ooh 35

确定是否需要不可变对象.

如果public在类中放置属性,则每次在代码中都可以更改每个实例的状态.所以你的班级可能是这样的:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public Person(){}
    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
    //Other properties, methods, events...
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,拥有一个Person(string name, int age)构造函数并不是那么有用.

第二种选择是实现不可变类型.例如:

public class Person
{
    public string Name { get; private set; }
    public int Age { get; private set; }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
    //Other properties, methods, events...
}
Run Code Online (Sandbox Code Playgroud)

现在你有一个构造函数设置状态的情况下,一次,在创建时.请注意,现在属性的setter是private,因此在实例化对象后无法更改状态.

最佳实践是每次尽可能将类定义为不可变.要了解不可变类的优点,我建议你阅读这篇文章.


Pau*_*lor 10

真的取决于你的要求,虽然最近我看到了至少定义了一个裸构造函数的类的趋势.

在via构造函数中发布参数的好处是,您知道在实例化之后可以依赖这些值.缺点是你需要在任何希望能够用裸构造函数创建对象的库中投入更多的工作.

我个人的偏好是使用一个简单的构造函数并将任何属性设置为声明的一部分.

Person p=new Person()
{
   Name = "Han Solo",
   Age = 39
};
Run Code Online (Sandbox Code Playgroud)

这解决了"类缺乏裸构造函数"问题,加上减少维护(我可以在不更改构造函数的情况下设置更多内容).


xle*_*ier 6

这不是最好的方式.两者都完全相同,除非你想在初始化期间使用传递给构造函数的参数进行一些额外的处理,或者如果你想在调用构造函数之后确保一致的状态.如果是这种情况,请选择第一个.

但出于可读性/可维护性的原因,请避免创建具有太多参数的构造函数.

在这种情况下,两者都可以.


Hug*_*ota 6

在我看来,这只是决定论证是否可选的问题.如果Person对象不应该(逻辑上)存在而没有Name和Age,那么它们在构造函数中应该是必需的.如果它们是可选的(即它们的缺失不会对对象的良好运行造成威胁),请使用setter.

以下是Symfony关于构造函数注入的文档的引用:

使用构造函数注入有几个优点:

  • 如果依赖是一个需求而类没有它就无法工作,那么通过构造函数注入它可以确保在使用类时它就存在,因为没有它就无法构造类.
  • 构造函数只在创建对象时被调用一次,因此您可以确保在对象的生命周期内依赖项不会更改.

这些优点意味着构造函数注入不适合使用可选的依赖项.与类层次结构结合使用也更加困难:如果一个类使用构造函数注入,那么扩展它并覆盖构造函数就会出现问题.

(Symfony是最受欢迎和最受尊敬的PHP框架之一)


jer*_*naa 6

怎么样

var obj = new {ID = 1, Price = 2};
Run Code Online (Sandbox Code Playgroud)