OOP:使用属性和构造函数

时间:2014-06-02 10:48:26

标签: c# oop inheritance properties constructor

我关注c# complete reference。以下是演示Constructor and inheritance

的示例
class TwoDShape {
  double pri_width;
  double pri_height;
  // Properties for Width and Height.
  public double Width {
     get { return pri_width; }
     set { pri_width = value < 0 ? -value : value; }
  }
  public double Height {
     get { return pri_height; }
     set { pri_height = value < 0 ? -value : value; }
  }

class Triangle : TwoDShape {
  string Style;
  // Constructor.
  public Triangle(string s, double w, double h) {
    Width = w;   
    Height = h;  
    Style = s;   
  }

现在在{(1}}内的Main()我有

Program.cs

我的问题是,当我们使用属性并使用它们初始化我们的字段时,为什么我们使用构造函数然后在这个构造函数字段内初始化。

哪种方法更好用构造/属性或这种方法。请解释这种方法,因为我无法获得这种逻辑(初始化的构造函数和属性)

3 个答案:

答案 0 :(得分:3)

构造函数应该用于需要为类设置某些变量(属性)才能处于正确状态的类。如果您只使用属性,则无法保证这些属性已初始化,因为您没有编译错误,并且开发人员很容易忘记初始化它们。

例如,假设您有一个在数据库中工作的类。如果你这样定义:

public class UserRepository
{
    public DbConnection Connection { get; set; }

    public User GetUser(string id)
    {
        //...
    }
}

..以下代码编译正常:

var repos = new UserRepository();
var user = repos.GetUser("22");

..但是当你运行它时,你会得到一个例外。

如果您使用构造函数,除非传递数据库连接,否则您将无法使用该类。

public class UserRepository
{
    public UserRepository(DbConnection connection)
    {
        if (connection == null) throw new ArgumentNullException("connection");

        Connection = connection;
    }

    public DbConnection Connection { get; private set; }

    public User GetUser(string id)
    {
        //...
    }
}


//Now forced to init the class correctly
var repos = new UserRepository(dbConnection);
var user = repos.GetUser("22");

这方面的另一个方面是代码维护。当您最初编写代码时,您通常可以完全控制它包含的内容以及如何初始化类。因此一切运作良好。但是当你几个月后回到这个项目时,你可能会忘记很多。如果您正在使用构造函数,那么您可以确保您创建的所有类都已正确初始化。

答案 1 :(得分:1)

简单来说,使用构造函数抽象正在完成的工作,将其放在一个黑盒子里。

在属性上设置值可以让用户更有自由度,因为他们可能会遇到班级开发人员没想到的事情。

这一切都归结为你愿意给那些使用你班级的人多少自由。

答案 2 :(得分:1)

构造函数shoud设置对象必需的所有字段。因此,您应该实现一个创建一致实例的构造函数。

创建实例后,您可以使用属性来更改对象状态,但这可能很危险,因为这些更改可能会导致实例的状态不正确。

我总是喜欢将我的类实现为不可变类型,因此你在构造函数中设置了state并且只提供了#34; getters&#34;访问字段值。