【发布时间】:2011-01-20 19:22:00
【问题描述】:
我一直在 Microsoft VB.NET 教程中听到这两个词。这两个词在引用变量时有什么区别?
【问题讨论】:
我一直在 Microsoft VB.NET 教程中听到这两个词。这两个词在引用变量时有什么区别?
【问题讨论】:
变量 位于 2 组中的 1 组中。 Value 类型或 Reference 类型。 int 和 DateTime 等类型是 value 类型。相反,您创建的任何类都是 reference 类型。 C# 字符串也是 reference 类型。 .NET 框架中的大多数东西都是 reference 类型。
有变量name和它的value。 两部分。
变量的名称就是你声明它的名字。 值是您分配给它的值。
所有变量总是在变量被声明时被赋予一个初始值。因此所有变量都初始化。
对于 value 类型,如int,如果您不明确这样做,编译器会给它们一个有效值。 int的初始化默认为零,DateTime的初始化为DateTime.MinValue默认。
引用类型变量初始化到你给它的对象。如果您不这样做,编译器将不会分配对象(即有效值)。在这种情况下,值为null - 没有。所以我们说引用被初始化为null。
人类诞生了。对象被实例化。婴儿是人类的实例,对象是某个类的实例。
创建类的实例的行为称为实例化(Ta-Da!)
MyClass myClassyReference = new MyClass();
上面说“……创建一个对象的实例……”是错误的
编辑 - 受 cmets 讨论的启发
使用不同的术语正在发生三件不同的事情(上图),并且该术语不可互换:
MyClass myClassyReference
new MyClass()
=。重申事实:
引用类型变量也简称为“引用”。 “值类型变量”不是引用。
这:“objectA 是一个对象的实例”是非常错误的。如果 objectA 是“objectB 的一个实例”,那么它一定是 objectA 以 objectB 的类型开始生命 - 无论是什么 - 和当前状态 - 无论是什么。当 objectB 发生变化时创建对象 D、E 和 F 怎么样?不,不!这是“objectA 是类的实例”的概念和技术案例。 “实例化”和“实例化”具有精确的含义 - 对象从类中获取其类型、定义和值。
MyClass myClassyReference = null一般我们不会说“变量赋值为null”,也不会说“变量引用了null”,而是说“变量为null”;或者“变量没有引用任何东西”,或者“引用为空”
实际应用:
我指着你的代码说“这个实例有一个无效的属性。也许这就是循环失败的原因。你必须在实例化期间验证参数。” (即构造函数参数)。
我在您的代码中看到了这一点,
MyClass myClassyReference;
myClassyReference.DoSomething();
“您声明了变量但从未分配它。它是空的,所以它没有引用任何东西。这就是方法调用引发异常的原因。”
结束编辑
引用类型变量的名称和值是独立存在的。我的意思是独立。
一个实例化的对象可能有也可能没有对它的引用。
一个实例化的对象可能有很多对它的引用。
声明的引用可能指向一个对象。
【讨论】:
变量被初始化为一个值。 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();
【讨论】:
initialize 就是将其设置为初始值。 实例化某事就是创建它的一个实例。
通常这或多或少是一样的。这个:
SqlConnection conn = new SqlConnection();
实例化 SqlConnection 对象,并初始化 conn 变量,方法是将其设置为该实例。
由于对象的构造函数还将对象的属性设置为其默认值,因此通常说实例化对象会对其进行初始化是正确的。 (误导,如果对象公开了一个方法,您必须在实例化后显式调用该方法才能对其进行初始化,有时就是这种情况。)
【讨论】:
*实例化意味着为类或对象创建实例。初始化意味着*为任何目的初始化相同的对象或类。**
【讨论】:
实例化意味着对象的一个实例已经被创建。已启动意味着同一个对象已经完成了一些初始化。
【讨论】:
当你实例化一个类或对象时,你正在创建它的一个新实例,或者分配内存来“保存”一个。初始化该对象将是在实例化期间执行的指令。
【讨论】:
实例化是指创建类的实例。那个实例就是一个对象,你可以设置它的属性,或者调用它的方法(告诉它做事)。
启动是指您为某事设置一组初始条件。那个东西可能是一个对象,你告诉它自己初始化,或者只是一个你分配值的变量。
一个对象可能会初始化一些其他的东西,或者甚至实例化其他对象作为其初始化的一部分。
不同之处在于,实例化是创建可以做某事的事物;启动是完成的事情。
【讨论】:
查看 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."
【讨论】:
我们可以这样看。下面一行代码:
var p = new Person();
上面一行可以理解为以下两种方式:
参考的主题或上下文很重要。在谈到变量时,我们使用initialize这个词。在谈到类/类型时,我们使用实例化这个词。
【讨论】:
实例化是指分配内存以创建类的实例,而初始化是指通过将变量名称分配给该实例来命名该实例。
例如:SqlConnection conn = new SqlConnection();
这里new 是为实例分配内存的关键字,conn 是为该实例分配的变量名。
【讨论】:
其他人已经解释了差异,所以我不会详细说明。但是在某些情况下,实例化没有正确初始化对象。当你实例化一个对象时,你也会用一些数据来初始化它。类/类型将具有初始化逻辑,而实例化逻辑通常由new 关键字执行(基本上是内存分配、引用复制等)。但是实例化不一定会导致对象处于有效状态,也就是我们可以说对象是未初始化的。这是一个可以实例化对象但不能初始化的实际示例(对不起,例如在 C# 中)。
class P { string name = "Ralf"; }
WriteLine(new P().name); // "Ralf";
WriteLine((FormatterServices.GetUninitializedObject(typeof(P)) as P).name); // null
GetUninitializedObject 不会调用构造函数来在那里实例化对象(但有一些内部魔法)。
人们也可能会争辩说值类型没有被实例化,而只是被初始化,因为当你做new.. 时它不需要新的分配,但这取决于你对实例化的定义。
【讨论】: