【问题标题】:What is the difference between "instantiated" and "initialized"?“实例化”和“初始化”有什么区别?
【发布时间】:2011-01-20 19:22:00
【问题描述】:

我一直在 Microsoft VB.NET 教程中听到这两个词。这两个词在引用变量时有什么区别?

【问题讨论】:

    标签: vb.net variables


    【解决方案1】:

    值相对于引用类型

    C# 中的

    变量 位于 2 组中的 1 组中。 Value 类型或 Reference 类型。 intDateTime 等类型是 value 类型。相反,您创建的任何类都是 reference 类型。 C# 字符串也是 reference 类型。 .NET 框架中的大多数东西都是 reference 类型。

    变量的一部分

    有变量name和它的value两部分

    变量的名称就是你声明它的名字。 是您分配给它的值。

    变量被初始化

    所有变量总是在变量被声明时被赋予一个初始值。因此所有变量都初始化

    对于 value 类型,如int,如果您不明确这样做,编译器会给它们一个有效值。 int初始化默认为零,DateTime初始化DateTime.MinValue默认。

    引用类型变量初始化到你给它的对象。如果您不这样做,编译器将不会分配对象(即有效值)。在这种情况下,值为null - 没有。所以我们说引用被初始化为null。

    对象被实例化

    人类诞生了。对象被实例化。婴儿是人类的实例,对象是某个类的实例

    创建类的实例的行为称为实例化(Ta-Da!)

    所以 declareinitializeinstantiate 像这样组合在一起

    MyClass myClassyReference = new MyClass();
    

    上面说“……创建一个对象的实例……”是错误的


    编辑 - 受 cmets 讨论的启发

    使用不同的术语正在发生三件不同的事情(上图),并且该术语不可互换:

    1. 声明了一个引用变量 - MyClass myClassyReference
    2. 一个对象被实例化(...来自/来自给定的,隐含) - new MyClass()
    3. 对象已分配给变量。 =

    重申事实:

    1. 引用类型变量也简称为“引用”。 “值类型变量”不是引用。

    2. 这:“objectA 是一个对象的实例”是非常错误的。如果 objectA 是“objectB 的一个实例”,那么它一定是 objectA 以 objectB 的类型开始生命 - 无论是什么 - 和当前状态 - 无论是什么。当 objectB 发生变化时创建对象 D、E 和 F 怎么样?不,不!这是“objectA 是类的实例”的概念和技术案例。 “实例化”和“实例化”具有精确的含义 - 对象从类中获取其类型、定义和值。

    3. MyClass myClassyReference = null一般我们不会说“变量赋值为null”,也不会说“变量引用了null”,而是说“变量为null”;或者“变量没有引用任何东西”,或者“引用为空”

    实际应用:

    • 我指着你的代码说“这个实例有一个无效的属性。也许这就是循环失败的原因。你必须在实例化期间验证参数。” (即构造函数参数)。

    • 我在您的代码中看到了这一点,

       MyClass myClassyReference;
       myClassyReference.DoSomething();
      

      “您声明了变量但从未分配它。它是空的,所以它没有引用任何东西。这就是方法调用引发异常的原因。”

    结束编辑


    难以承受的生命之轻

    引用类型变量的名称和值是独立存在的。我的意思是独立。

    一个实例化的对象可能有也可能没有对它的引用。

    一个实例化的对象可能有很多对它的引用。

    声明的引用可能指向一个对象。

    【讨论】:

    • 完美解释!
    • 如果说:“...创建对象的实例...”是错误的,您应该怎么说? “......实例化一个对象,并为其分配一个引用......”?
    • 或者:“...实例化一个对象,并将一个变量初始化为它的引用”?这包括两个词,并且似乎将其全部拼写出来-尽管以相当冗长的方式。你怎么看?
    • ... what should you say? 说:“创建一个类的实例”,而不是“......一个对象”。并且“将变量实例化为它的引用”是双重谈话,并且在两个方面是错误的:(1)仅实例化对象。 (2) “指向”对象的变量是引用变量,或者简而言之,变量就是引用。我会换一种说法:“引用类型”变量是一个引用。它指代 - 或指向 - 一个对象。
    【解决方案2】:

    变量被初始化为一个值。 object 在为它分配内存并且它的构造函数已经运行时被实例化。

    例如这里是一个变量:

    Dim obj as Object
    

    此变量尚未初始化。一旦我为obj 变量赋值,该变量就会被初始化。以下是初始化示例:

    obj = 1
    obj = "foo"
    

    实例化是一个非常不同的东西,但是是相关的,因为实例化之后通常是初始化:

    Dim obj As New Object()
    

    在前面的代码行中,obj 变量已初始化,并引用了 实例化 的新 Object。我们说新的Object 被实例化是因为我们创建了它的一个新实例。

    现在我相信 VB.NET 使这比 C# 更令人困惑,因为不清楚是否在上面的代码中进行了赋值。在 C# 中,更清楚的是既有实例的实例化,也有变量的初始化:

    Object obj = new Object();
    

    【讨论】:

    • @Andrew 对象 obj = 1;是初始化和 object obj = new object()/ 是实例化和初始化这就是你提到的。现在我想问你两件事。 1. 这是什么?对象对象; ? 2.我使用object obj时是否分配了内存;??或者当我通过这个代码对象 obj = 1 初始化它时它被分​​配; ?
    • 我会说“object obj”是声明,不,内存还没有分配。或者至少只有足够的内存来保存“null”值。变量的实际内存将根据初始化后的值分配。
    【解决方案3】:

    initialize 就是将其设置为初始值。 实例化某事就是创建它的一个实例。

    通常这或多或少是一样的。这个:

    SqlConnection conn = new SqlConnection();
    

    实例化 SqlConnection 对象,并初始化 conn 变量,方法是将其设置为该实例。

    由于对象的构造函数还将对象的属性设置为其默认值,因此通常说实例化对象会对其进行初始化是正确的。 (误导,如果对象公开了一个方法,您必须在实例化后显式调用该方法才能对其进行初始化,有时就是这种情况。)

    【讨论】:

      【解决方案4】:

      *实例化意味着为类或对象创建实例。初始化意味着*为任何目的初始化相同的对象或类。**

      【讨论】:

        【解决方案5】:

        实例化意味着对象的一个​​实例已经被创建。已启动意味着同一个对象已经完成了一些初始化。

        【讨论】:

          【解决方案6】:

          当你实例化一个类或对象时,你正在创建它的一个新实例,或者分配内存来“保存”一个。初始化该对象将是在实例化期间执行的指令。

          【讨论】:

            【解决方案7】:

            实例化是指创建类的实例。那个实例就是一个对象,你可以设置它的属性,或者调用它的方法(告诉它做事)。

            启动是指您为某事设置一组初始条件。那个东西可能是一个对象,你告诉它自己初始化,或者只是一个你分配值的变量。

            一个对象可能会初始化一些其他的东西,或者甚至实例化其他对象作为其初始化的一部分。

            不同之处在于,实例化是创建可以做某事的事物;启动是完成的事情。

            【讨论】:

              【解决方案8】:

              查看 Java 文档: https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html

              "Point originOne = new Point(23, 94);

              Declaration: The code set in bold are all variable declarations that associate a variable name with an object type.
              Instantiation: The new keyword is a Java operator that creates the object.
              Initialization: The new operator is followed by a call to a constructor, which initializes the new object."
              

              【讨论】:

                【解决方案9】:

                我们可以这样看。下面一行代码:

                var p = new Person();
                

                上面一行可以理解为以下两种方式:

                1. 变量 p 已初始化为人员类
                2. Person 类已在变量 p 中实例化

                参考的主题或上下文很重要。在谈到变量时,我们使用initialize这个词。在谈到类/类型时,我们使用实例化这个词。

                【讨论】:

                  【解决方案10】:

                  实例化是指分配内存以创建类的实例,而初始化是指通过将变量名称分配给该实例来命名该实例。

                  例如:SqlConnection conn = new SqlConnection();

                  这里new 是为实例分配内存的关键字,conn 是为该实例分配的变量名。

                  【讨论】:

                    【解决方案11】:

                    其他人已经解释了差异,所以我不会详细说明。但是在某些情况下,实例化没有正确初始化对象。当你实例化一个对象时,你也会用一些数据来初始化它。类/类型将具有初始化逻辑,而实例化逻辑通常由new 关键字执行(基本上是内存分配、引用复制等)。但是实例化不一定会导致对象处于有效状态,也就是我们可以说对象是未初始化的。这是一个可以实例化对象但不能初始化的实际示例(对不起,例如在 C# 中)。

                    class P { string name = "Ralf"; }
                    
                    WriteLine(new P().name); // "Ralf";
                    WriteLine((FormatterServices.GetUninitializedObject(typeof(P)) as P).name); // null
                    

                    GetUninitializedObject 不会调用构造函数来在那里实例化对象(但有一些内部魔法)。

                    人们也可能会争辩说值类型没有被实例化,而只是被初始化,因为当你做new.. 时它不需要新的分配,但这取决于你对实例化的定义。

                    【讨论】:

                      猜你喜欢
                      • 2013-01-13
                      • 1970-01-01
                      • 1970-01-01
                      • 2013-02-11
                      • 1970-01-01
                      • 2017-03-23
                      • 1970-01-01
                      • 2016-12-07
                      • 1970-01-01
                      相关资源
                      最近更新 更多