创建对象的最佳方式

问题描述 投票:25回答:7

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

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;

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

c# .net oop constructor instance
7个回答
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...
}

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

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

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


9
投票

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

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

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

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

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


6
投票

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

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

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


6
投票

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

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

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

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

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

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


4
投票

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

Person p=new Person(){
Name='abc',
Age=15
}

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);
    }
}

0
投票

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

 Product obj = new Product
            {
                ID = 21,
                Price = 200,
                Category = "XY",
                Name = "SKR",
            };
© www.soinside.com 2019 - 2024. All rights reserved.