我一直在听VB.NET的Microsoft教程中使用的这两个词。当引用变量时,这两个词有什么区别?
我一直在听VB.NET的Microsoft教程中使用的这两个词。当引用变量时,这两个词有什么区别?
Answers:
C#中的变量位于2组中的1组中。值类型或引用类型。类型如int
和DateTime
是值类型。相反,您创建的任何类都是引用类型。C#字符串也是引用类型。.NET框架中的大多数东西都是引用类型。
有变量名及其值。两部分。
变量的名称就是您声明的名称。该值是您为其分配的值。
所有变量总是给出一个初始在该点的变量值声明。因此,所有变量均已初始化。
对于值类型,int
如果您未明确指定,则编译器将为它们提供有效值。int
的初始化默认为零,DateTime
的初始化到DateTime.MinValue
默认。
引用类型变量将初始化为您提供的对象。否则,编译器将不会分配对象(即有效值)。在这种情况下,值为null
-无。所以我们说该引用被初始化为null。
人类是天生的。对象被实例化。婴儿是人类的实例,对象是某个类的实例。
创建类实例的动作称为实例化(Ta-Da!)。
MyClass myClassyReference = new MyClass();
在上面,说“……创建对象的实例……” 是错误的。
编辑-受评论讨论启发
使用不同的术语(上面)正在进行三种不同的事情,并且这些术语不可互换:
MyClass myClassyReference
new MyClass()
=
。重申事实:
引用类型的变量也简称为“引用”。“值类型变量”不是参考。
这:“ objectA是对象的实例”是完全错误的。如果对象A是“对象B的实例”,则必须保证对象A以对象B的类型-无论是-还是当前状态-无论是哪种开始。随着objectB的变化创建对象D,E和F怎么办?不,不!从概念和技术上讲,“ objectA是类的实例”。“实例化”和“实例化”具有精确的含义-对象从类中获取其类型,定义和值。
MyClass myClassyReference = null
通常,我们不会说“变量被分配为null”,也不会说“变量引用了null”,相反,我们说“变量为null”。或“变量未引用任何内容”,或“引用为空”
实际应用:
我用手指指着您的代码,然后说:“该实例具有无效的属性。也许这就是循环失败的原因。您必须在实例化期间验证参数。” (即构造函数参数)。
我在您的代码中看到了这一点,
MyClass myClassyReference;
myClassyReference.DoSomething();
“您声明了变量但从未分配过。它为null,因此它没有引用任何内容。这就是方法调用引发异常的原因。”
结束编辑
甲引用类型变量的名称和值独立地存在。我的意思是独立。
一个实例化的对象可以或可以不具有它的一个引用。
一个实例化对象可能有它的许多参考。
甲声明参考可以或可以不被指向的对象。
甲变量被初始化为一个值。当为对象分配内存并且其构造函数已运行时,将实例化该对象。
例如,这是一个变量:
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();
实例化意味着该对象的实例已创建。已启动表示同一个对象已进行了一些初始化。
请参阅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."
其他人已经解释了差异,所以我将不详细介绍。但是在某些情况下,实例化无法正确初始化对象。实例化对象时,还需要使用一些数据对其进行初始化。类/类型将具有初始化逻辑,而实例化逻辑通常由new
关键字执行(基本上是内存分配,引用复制等)。但是实例化并不一定会导致对象处于有效状态,也就是说我们可以说对象未初始化。这是一个实际的示例,其中的对象可以实例化但不能初始化(对不起,例如,在C#中)。
class P { string name = "Ralf"; }
WriteLine(new P().name); // "Ralf";
WriteLine((FormatterServices.GetUninitializedObject(typeof(P)) as P).name); // null
GetUninitializedObject
不会调用构造函数在那里实例化对象(而是一些内部魔术)。
也可能会争辩说,值类型不是实例化的,而是仅初始化的,因为当您这样做时不需要新的分配,new..
但这取决于实例化的定义。