关于c#中对象的基本问题

嘿伙计们,刚开始使用C#。 我有一些疑惑,如果有人能帮助我,我会非常感激

问题#1

animal dog; dog = new animal(); 

上面两行之间有什么区别?


问题2

 namespace proj1 { public class form1:form { guy bob; public form1() { initialize component(); bob = new guy(); bob.name = "bob"; } } 

实例化Form1类时,构造函数form1()是第一个运行的东西。

但是怎么能在Guy bob之前执行bob = new guy() ,这是在类的数据成员声明中?

问题1:

 animal dog; dog = new animal(); 

在此示例的第一行中,您声明了一个类型为animal的变量。 这意味着这个变量名称及其类型将由C#编译器发送到程序集中,作为IL的一部分,用于您当前所处的任何方法的堆栈。

第二行是有趣的部分。 在第二行,您将创建一个animal类型的新实例,并将该实例的引用分配给您在上一行创建的dog变量。 此代码也会发送到程序集,但这表示在调用此行时将在执行时运行的代码。

问题2:

 public class form1 : form { guy bob; public form1() { initialize component(); bob = new guy(); bob.name = "bob"; } } 

这个例子更有趣,因为你正在处理比第一个例子更大的概念。 在这个例子中,你已经在类form1声明了一个私有字段 – 这与在第一个问题中简单地声明一个变量的处理方式不同。

字段是您当前所处类型的状态的一部分。换句话说,通过在当前类型的范围内声明此变量,您指示此变量是字段,因此是该类型蓝图的一部分。 这意味着为此类型的所有实例声明了此字段。

这意味着guy bob;的宣言guy bob; 实际上是在你给bob字段分配任何引用之前定义的。 它实际上是在编译时定义的,因为编译器会将此字段作为字段发送到程序集中,程序集的结果元数据也将反映此字段。 由于此字段是在编译时定义的,因此您可以看到为什么能够为其分配引用,因为在运行代码之前,不会执行分配对该字段的引用的代码。

1 – 第一行声明变量,第二行为其分配一个新的对象实例

2 – “Guy bob”只是一个声明而且没有“执行”

Q1:First是一个声明(它在运行时不“做”任何事情)。

Q2: 家伙鲍勃再次只是一个宣言。 它没有被执行,它只是告诉编译器对象应该包含什么。 直到new guy()才构造对象。

Guy bob只是说“bob是一个包含Guy类型值的变量”。 bob = new Guy()说“变量bob现在拥有Guy类型的新值”

拉姆有第一季。 我会进一步说

Animal rover = new Animal()

漫游者是动物的特定实例(实现)。

对于Q2,运行C#程序有两个不同的部分 – 首先,编译程序,然后运行编译的程序。

在编译期间,所有对象声明,方法定义和诸如此类的东西都被扫描并写出到Microsoft中间语言MSIL。 这些声明的顺序对这些声明没有任何影响,它只是程序的行为 ,方法体中的位,排序很重要。

换句话说,这里有两组事情:“给定x和y和z,Bob将是Guy类型的对象……”和“……去做这个,这个和这个,让Bob Guy类型的对象,依此类推。“

更进一步,很可能将所有对象声明放在一个文件中,将方法放在另一个文件中。 (这些部分类由Visual Studio中的设计人员使用。)

问题#1

 animal dog; //declares that the variable will be used dog = new animal(); //the actual object is made in memory and linked to the variable name 

问题2

在声明变量之前,不能为变量赋值。 你能做的最好就是一行完成。

 Guy bob = new guy() ; 

在第一个例子中,第一行你没有实际实例化你的对象,只是声明了它。 第二行通过调用它的构造函数来实例化( new() )对象。

你的第二个例子是类似的东西, form1()是你的表单类的构造函数,并将实例化你的私有成员字段bob

阅读我所说的构造函数。 从这篇维基百科文章开始。

Q1:动物是阶级,狗被宣布为动物的一个例子。 如果我要给你一个神学,把课程视为建筑物的蓝图,对象就是实际实现那个蓝图,即房子。 dog = new animal()实际上为它分配了所需的内存空间。 如果您尝试访问dog的属性/实例方法/公共变量而不执行“dog = new animal()”,您将收到运行时错误“对象引用未设置为对象的实例”

Q2:同样如此。 如果你来自C背景,那么方法放在代码集中(方法声明,如果我没记错的话),而不是C#。

问题一 :它声明变量(dog),也称为引用变量,因为new animal()提供/分配内存空间,同时指定此内存空间应包含的对象类型。 因此,通过执行此操作(dog = new animal()),您将通过变量狗提供对内存位置的引用。

问题二 :在编译时你编程知道对象(Class)有一个必须包含对象类型“gug”的引用变量bob。 所以它更像是尚未构建的构建体系结构。 家伙鲍勃从未被执行过。 这就是执行“bob = new guy();”。

Q1:第一行声明变量,第二行为其分配一个新的对象实例

Q2:我将看一下Jon Skeet页面中的Instance Variable初始化器部分,以便更好地了解正在发生的事情。

问题一

第一行是声明一个叫做动物类型的狗的新变量。 那就是你说“我有一个新的变量,我可以用它的名字’狗’来引用。在这个变量中,我只能把’动物’类型的东西放进去。”

它实际上并没有在运行时做任何事情,它只是声明你对编译器的意图。 你告诉它你想要一个新变量,你将如何引用它(使用名称’dog’),以及你可以为它指定什么类型的值(’animal’类型的东西)

第二行是实际做某事的位。 它创建一个类型为animal的新对象,然后将该对象分配给您之前声明的变量,这意味着您可以在其他地方使用该变量来引用您创建的对象。

您只能将事物分配给您告诉编译器的变量(即声明其名称和类型)。 这允许编译器为您检查各种事物并提供某种级别的所谓类型安全性。 [其他语言没有这些限制,这使它们更简洁和灵活,但有可能更容易引入细微的错误]

您可以将两个步骤 – 变量声明和赋值 – 结合起来,如下所示:

 animal dog = new animal(); 

这向编译器声明了一个名为’dog’的新变量,类型为’animal’。 在运行时,它会创建一个类型为animal的新对象,并将其分配给我们声称为’dog’的变量。