25

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

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...
}

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

Person p=new Person("abc",15)

或者

Person p=new Person();
p.Name="abc";
p.Age=15;

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

4

8 回答 8

36

决定是否需要不可变对象。

如果您将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...
}

在这种情况下,拥有一个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...
}

现在您有一个构造函数,它在创建时设置实例的状态,一次。请注意,现在属性的设置器是private,因此您无法在实例化对象后更改状态。

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

于 2013-02-07T17:24:24.253 回答
11

确实取决于您的要求,尽管最近我看到了至少定义了一个裸构造函数的类的趋势。

通过构造函数发布参数的好处是您知道在实例化后可以依赖这些值。不利的一面是,您需要对任何希望能够使用裸构造函数创建对象的库进行更多工作。

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

Person p=new Person()
{
   Name = "Han Solo",
   Age = 39
};

这解决了“类缺少裸构造函数”的问题,并且减少了维护(我可以在不更改构造函数的情况下设置更多东西)。

于 2013-02-07T09:02:53.790 回答
6

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

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

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

于 2013-02-07T08:59:29.813 回答
6

在我看来,这只是决定参数是否可选的问题。如果没有 Name 和 Age 的 Person 对象不应该(逻辑上)存在,那么它们应该在构造函数中是强制性的。如果它们是可选的(即它们的缺失不会对对象的良好功能造成威胁),请使用设置器。

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

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

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

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

(Symfony 是最流行和最受尊敬的 php 框架之一)

于 2013-02-07T11:31:54.110 回答
4

如果您认为更少的代码意味着更高的效率,那么使用构造函数会更好。您还可以使用如下代码:

Person p=new Person(){
Name='abc',
Age=15
}
于 2013-02-07T09:04:04.970 回答
1

怎么样

var obj = new {ID = 1, Price = 2};
于 2021-06-08T20:45:33.870 回答
0

或者,您可以使用数据文件将许多人员对象放入列表或数组中。您确实需要为此使用 System.IO。并且您需要一个包含有关对象的所有信息的数据文件。

它的方法如下所示:

static void ReadFile()
{
    using(StreamWriter writer = new StreamWriter(@"Data.csv"))
    {
        string line = null;
        line = reader.ReadLine();
        while(null!= (line = reader.ReadLine())
                {
                    string[] values = line.Split(',');
                    string name = values[0];
                    int age = int.Parse(values[1]);
                }
        Person person = new Person(name, age);
    }
}
于 2016-10-11T11:06:28.043 回答
0

取决于您的要求,但最有效的创建方法是:

 Product obj = new Product
            {
                ID = 21,
                Price = 200,
                Category = "XY",
                Name = "SKR",
            };
于 2018-03-06T07:21:51.300 回答