我觉得这应该在某个地方的第1课的第1页上进行了解释,但要么它没有,要么我错过了它。
如果有以下课程:
class Person
{
public string name {get; set;}
public int age {get; set;}
}
然后我这样做:
Person myUncle = new Person();
为什么我一开始就需要第一个人?
我知道我正在创建一个类型为" Person"这被称为" myUncle"。
为什么我们一开始就拥有那个人?可以是一个新的人();对象是别的吗?
我所看到的每一个教程/书籍都只是通过这一部分滚动,作者说"好了,现在我们以这种方式创建一个新实例......"但从未解释为什么语法是这样的。
答案 0 :(得分:6)
左侧声明了Person
类型的变量。
右侧创建Person
类型的对象。
=
将右侧的对象分配给左侧的变量。
您可能会问,为什么C#
无法找出我想要的变量类型?
答案是,它可以:
var myUncle = new Person();
但是,在某些情况下,您可能希望显式声明该类型。
这是一个有点人为的例子,但假设我有一个新类,它是Person
的子类。
class Child : Person
{
public bool isChildish {get; set;}
}
然后我可以声明一个Person
类型的变量来保存Child
类型的对象。
Person myUncle = new Child();
现在,左侧的Person
看起来不那么多了。
更新:您可能希望Person myUncle
超过var myUncle
的一个原因是您可以将声明与初始化分开。
以下代码将编译:
Person myUncle;
myUncle = new Person();
以下代码无法编译;
var myUncle;
myUncle = new Person();
答案 1 :(得分:3)
我喜欢考虑它的方式是这样的:右手边是对象“实际上是”和左手边,是你将“告诉”对象的应用程序的其他部分。因此,在像您这样的基本示例中,您正在创建一个Person并告诉应用程序的其余部分这是一个Person对象,但您并不总是必须准确显示您的对象是什么。例如:
Person p1 = new Doctor();
Person p2 = new Teacher();
IService s = new ServiceImpl();
IEnumerable<Person> personEnum = new List<Person>();
在前两个示例中,您创建了两个继承自Person的对象doctor和teacher,但是传递给p1或p2的应用程序的任何部分只会知道它是Person对象。在第三个示例中,对象实际上是ServiceImpl类型,但应用程序的其余部分只知道这是一个实现IService接口的对象。
所有这一切的要点是通过尽可能多地了解实际对象来保持应用程序松散耦合。