这似乎是很愚蠢的和基本的问题,但我想谷歌它,但无法找到一个满意的答案,
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;
什么是这两种方法,什么是创建对象的最佳方式之间的区别?
如果你需要一个不可变对象与否决定。
如果你把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
,所以你的对象实例化后,你不能改变的状态。
最好的做法是将类定义为可能的话每次都不变。 要了解一成不变的类的优势,我建议你阅读这篇文章 。
真的取决于你的需求,不过,最近我已经看到了班趋势,确定至少一个裸露的构造函数。
通过构造函数中发布您的参数的好处是,你知道这些值可以实例化后加以依赖。 缺点是,你需要投入更多的工作与期望能与裸构造函数创建对象的库。
我个人的偏好是去同一个裸构造和设置任何属性声明的一部分。
Person p=new Person()
{
Name = "Han Solo",
Age = 39
};
这得到各地的“类缺乏裸构造”的问题,再加上降低了维护(我可以设置更多的事情,而不改变构造函数)。
这里不是一个真正的最佳途径。 两者都是完全一样的,除非你想在初始化时用做传递给构造函数的参数一些额外的处理,或者如果你想确保只调用构造函数后相干态。 如果是的话,更喜欢第一个。
但对于可读性/可维护性的原因,避免过多的参数来创建构造函数。
在这种情况下,既会做。
在我的愚见,这仅仅是一个,如果参数都是可选与否决定的事情。 如果一个Person对象不应该(逻辑),而名字和年龄存在,它们应该是在构造函数中强制性的。 如果它们是可选的,(即他们的缺席是不是对象的良好运行的威胁),使用setter方法。
下面是Symfony的对构造函数注入的文档报价:
有几个优点,使用构造器注入:
- 如果相关性是一个要求和类不能工作没有它然后注入它通过构造确保当使用类作为类不能没有它来构造它是存在的。
- 构造函数创建对象时只被调用一次,所以你可以肯定的是,依赖不会对对象的生命周期中改变。
这些优势也意味着构造函数注入是不适合与可选的相关性问题。 这也是比较难的组合使用具有类层次结构:如果一个类使用构造函数注入,然后扩展它和重写构造成问题。
(Symfony的是最流行和推崇的PHP框架之一)
如果你觉得更少的代码意味着更高效的,所以,以构建功能比较好。 您还可以使用如下代码:
Person p=new Person(){
Name='abc',
Age=15
}
或者你可以使用一个数据文件,把许多人对象列表或阵列。 你需要使用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);
}
}
取决于你的需求量的,而是创造最有效的方法是:
Product obj = new Product
{
ID = 21,
Price = 200,
Category = "XY",
Name = "SKR",
};