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

时间:2009-12-06 14:00:54

标签: 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()是第一个运行的东西。

bob = new guy()如何在 Guy bob 之前执行?这是在类的数据成员声明中?

11 个答案:

答案 0 :(得分:3)

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

2 - “Guy bob”只是一个声明,并没有“执行”

答案 1 :(得分:2)

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

Q2: guy bob 再次只是一个声明。它没有被执行,它只是告诉编译器对象应该包含什么。直到 new guy()

才构建该对象

答案 2 :(得分:2)

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

答案 3 :(得分:2)

问题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;的声明实际上是在您分配对bob字段的任何引用之前定义的。它实际上是在编译时定义的,因为编译器会将此字段作为字段发送到程序集中,程序集的结果元数据也将反映此字段。由于此字段是在编译时定义的,因此您可以看到为什么能够为其分配引用,因为在代码运行之前,不会执行分配对该字段的引用的代码。

答案 4 :(得分:1)

拉姆在第一季度拥有它。我会进一步说出来

Animal rover = new Animal()

流浪者是动物的特定实例(实现)。

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

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

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

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

答案 5 :(得分:0)

问题#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() ;

答案 6 :(得分:0)

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

您的第二个示例是类似的事情,form1()是您的表单类的构造函数,并将实例化您的私有成员字段bob

阅读我所说的构造函数。从这个Wikipedia article开始。

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

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

Q2:我将查看Jon Skeet's page中的Instance Variable初始化程序部分,以便更好地了解正在发生的情况。

答案 10 :(得分:0)

问题一

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

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

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

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

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

animal dog = new animal();

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

相关问题