我关注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
我的问题是,当我们使用属性并使用它们初始化我们的字段时,为什么我们使用构造函数然后在这个构造函数字段内初始化。
哪种方法更好用构造/属性或这种方法。请解释这种方法,因为我无法获得这种逻辑(初始化的构造函数和属性)
答案 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;访问字段值。