C# 非常基本:类和对象的语法

C# 非常基本:类和对象的语法,c#,C#,我觉得这本应该在第1课的第1页的某个地方解释,但要么没有解释,要么我错过了 如果存在以下类别: class Person { public string name {get; set;} public int age {get; set;} } 后来我做了这个: Person myUncle = new Person(); 为什么我一开始就需要第一个人 我知道我正在创建一个名为“myUncle”的“Person”类型的新对象 为什么我们一开始就有那个人?可以换一个人吗;还有别的吗 我

我觉得这本应该在第1课的第1页的某个地方解释,但要么没有解释,要么我错过了

如果存在以下类别:

class Person
{
  public string name {get; set;}
  public int age {get; set;}
}
后来我做了这个:

Person myUncle = new Person();
为什么我一开始就需要第一个人

我知道我正在创建一个名为“myUncle”的“Person”类型的新对象

为什么我们一开始就有那个人?可以换一个人吗;还有别的吗


我所看到的每一个教程/书籍都只是在这一部分中滚动,作者说“好吧,现在我们以这种方式创建一个新实例…”,但从来没有解释语法为何是这样。

左侧声明了一个
Person
类型的变量

class Child : Person
{ 
    public bool isChildish {get; set;}
}
右侧创建类型为
Person
的对象

class Child : Person
{ 
    public bool isChildish {get; set;}
}
=
将左边的变量分配给右边的对象

您可能会问,为什么不能
C#
找出我想要的变量类型? 答案是,它可以:

var myUncle = new Person();
但是,在某些情况下,可能需要显式声明类型。 这是一个稍微做作的示例,但假设我有一个新类,它是
Person
的子类

class Child : Person
{ 
    public bool isChildish {get; set;}
}
然后,我可以声明一个
Person
类型的变量来保存
Child
类型的对象

Person myUncle = new Child();
现在,左边的
看起来没有那么多余了

Update:您可能希望
Person-myUncle
超过
var-myUncle
的一个原因是您可以将声明与初始化分开

将编译以下代码:

Person myUncle;
myUncle = new Person();
以下代码将不会编译

var myUncle;
myUncle = new Person();

我喜欢这样思考:右侧是对象“实际上是什么”,左侧是您将“告诉”应用程序的其他部分对象是什么。因此,在像您这样的基本示例中,您正在创建一个Person,并告诉应用程序的其余部分这是一个Person对象,但您不必总是确切地揭示对象是什么。例如:

Person p1 = new Doctor();
Person p2 = new Teacher();
IService s = new ServiceImpl();
IEnumerable<Person> personEnum = new List<Person>();
Person p1=新医生();
人员p2=新教师();
iSeries s=新的ServiceImpl();
IEnumerable personEnum=新列表();
在前两个示例中,您正在创建从Person继承的两个对象doctor和teacher,但通过p1或p2的应用程序的任何部分都只知道它是Person对象。在第三个示例中,对象实际上是ServiceImpl类型,但应用程序的其余部分只知道这是一个实现IService接口的对象


所有这些都是为了保持应用程序的松散耦合,只需要尽可能多地揭示实际对象。

事实就是如此。长话短说,C#要求所有变量都是类型化的,这就是为什么要在声明时指定变量的类型。var关键字是语法糖,即编译器用实际类型替换“var”。但是“我叔叔”永远是一个人或一个子类人,所以从功能上讲,var-my叔叔和Person-my叔叔没有区别,做一个而不做另一个的唯一原因是。。?为了可读性?是的,在这种情况下没有功能上的区别。我认为这是个偏爱的问题。来自C等语言的人有时更喜欢自己的类型是显式的。@user3565424,但是请注意,您不能声明
var-mybuff本身在一行上,但您可以轻松地声明
Person myUncle单独在一行上。这是一个重要的区别,如果您需要将声明和赋值分开,它可能会变得更加重要。