“实例化”和“初始化”之间有什么区别?


Answers:


142

相对于参考类型的值

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

变量的一部分

有变量及其两部分

变量的名称就是您声明名称。该是您为其分配

变量已初始化

所有变量总是给出一个初始在该点的变量值声明。因此,所有变量均已初始化

对于类型,int如果您未明确指定,则编译器将为它们提供有效值。int初始化默认为零,DateTime初始化DateTime.MinValue默认。

引用类型变量将初始化为您提供的对象。否则,编译器将不会分配对象(即有效值)。在这种情况下,值为null-无。所以我们说该引用被初始化为null。

对象被实例化

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

创建类实例的动作称为实例化(Ta-Da!)。

因此,像这样声明初始化实例化在一起

MyClass myClassyReference = new MyClass();

在上面,说“……创建对象的实例……” 是错误的。


编辑-受评论讨论启发

使用不同的术语(上面)正在进行三种不同的事情,并且这些术语不可互换:

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

重申事实:

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

  2. 这:“ objectA是对象的实例”是完全错误的。如果对象A是“对象B的实例”,则必须保证对象A以对象B的类型-无论是-还是当前状态-无论是哪种开始。随着objectB的变化创建对象D,E和F怎么办?不,不!从概念和技术上讲,“ objectA是类的实例”。“实例化”和“实例化”具有精确的含义-对象从类中获取其类型,定义和值。

  3. MyClass myClassyReference = null 通常,我们不会说“变量被分配为null”,也不会说“变量引用了null”,相反,我们说“变量为null”。或“变量未引用任何内容”,或“引用为空”

实际应用:

  • 我用手指指着您的代码,然后说:“该实例具有无效的属性。也许这就是循环失败的原因。您必须在实例化期间验证参数。” (即构造函数参数)。

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

    MyClass myClassyReference;
    myClassyReference.DoSomething();

    “您声明了变量但从未分配过。它为null,因此它没有引用任何内容。这就是方法调用引发异常的原因。”

结束编辑


生命中不能承受之轻

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

一个实例化的对象可以或可以不具有它的一个引用。

一个实例化对象可能有它的许多参考。

声明参考可以或可以不被指向的对象。


完美的解释!
M. Fawad Surosh '17

如果说“ ...正在创建对象的实例...”是错误的,您应该怎么说?“ ...实例化对象,并为其分配引用...”?
亚伦·达克

或者说:“ ...实例化一个对象,并将其初始化为对它的引用的变量”?这包括两个单词,并且似乎很清楚地将其拼写了出来-尽管用了很长的时间。你怎么看?
亚伦·达克

...你该怎么说? 说:“创建类的实例”,而不是“对象的...”。而“实例化一个变量以对其的引用”是双重谈论,并且在两种方式上是错误的:(1)仅实例化对象。(2)“指向”对象的变量是引用变量,或者简而言之,该变量是引用。我会说不同的话:“引用类型”变量是引用。它指的是(或指向)一个对象。
Radarbob

40

变量被初始化为一个值。当为对象分配内存并且其构造函数已运行时,将实例化该对象

例如,这是一个变量:

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; 是初始化,对象obj = new object()/是实例化和初始化,这就是您提到的内容。现在我想问你两件事。1.这是什么?对象obj; ?2.使用对象obj时是否已分配内存??或者当我通过此代码对象obj = 1对其进行初始化时,它已分配;?
kashif

我会说“对象obj”是声明,并且不,内存尚未分配。或者至少只有足够的内存来保存值“ null”。变量的实际内存将在初始化后根据该值进行分配。
亚伦·达克

14

初始化的东西就是把它设置为初始值。要实例化的东西是创建它的一个实例。

通常这或多或少是同一件事。这个:

SqlConnection conn = new SqlConnection();

实例化一个SqlConnection对象,并初始化所述conn通过将其设置到该实例变量。

由于对象的构造函数还将对象的属性设置为其默认值,因此说实例化实例将其初始化通常是正确的。(误导性的是,如果对象公开了在实例化后必须显式调用以初始化它的方法,有时是这样)。


4

*实例化是指为类或对象创建实例。实例化是指*出于任何目的初始化相同的对象或类。**



2

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


2

实例化是在创建类的实例时。然后,该实例就是一个对象,您可以设置其属性,或在其上调用方法(告诉它执行操作)。

初始化是指为某项设置一组初始条件时。某些东西可能是一个对象,您可以在其中告诉自己进行初始化,或者只是一个为其分配值的变量。

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

不同之处在于,实例化是指可以做某些事情的事物的创造。初始化是完成的工作。


1

请参阅Java文档:https : //docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html

Point originOne =新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."

1

我们可以这样看。对于下面的代码行:

var p = new Person();

上一行可以按以下两种方式阅读:

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

参考主题或上下文很重要。说到变量时,我们用“ 初始化”这个词。在讨论类/类型时,我们使用实例化一词。


0

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

例如: SqlConnection conn = new SqlConnection();

new是一个为实例分配内存的关键字,并且conn是为该实例分配的变量名。


0

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

class P { string name = "Ralf"; }

WriteLine(new P().name); // "Ralf";
WriteLine((FormatterServices.GetUninitializedObject(typeof(P)) as P).name); // null

GetUninitializedObject 不会调用构造函数在那里实例化对象(而是一些内部魔术)。

也可能会争辩说,值类型不是实例化的,而是仅初始化的,因为当您这样做时不需要新的分配,new..但这取决于实例化的定义。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.