om4*_*987 27 c# object new-operator
object a = new Dog();
Run Code Online (Sandbox Code Playgroud)
VS
Dog a = new Dog();
Run Code Online (Sandbox Code Playgroud)
在两种情况下a.GetType()
给出Dog
.两者都调用相同的构造函数(具有相同的层次结构).
那么请你告诉我这两个陈述之间的区别吗?
Ant*_*ram 36
两者都创建一个Dog对象.只有第二个允许您直接调用Dog方法或以其他方式将其视为狗,例如,如果您需要将对象作为类型的参数传递给方法Dog
(或者Dog层次结构中的某些东西比简单的更具体object
) .
object obj = new Dog();
// can only see members declared on object
var type = obj.GetType(); // can do this
Console.WriteLine(obj.ToString()); // also this
obj.Bark(); // Error! Bark is not a member of System.Object
Dog dog = new Dog();
// can do all of the methods declared for Object
dog.Bark(); // can finally use the method defined for Dog
Run Code Online (Sandbox Code Playgroud)
new Dog()
是一个创建新Dog
实例的表达式.它调用类的无参数构造函数Dog
.
a
是一个变量:内存中的存储单元,Dog
在分配后保存对实例的引用.
不同之处在于Dog
变量只能保存对Dog
实例(或派生自的任何类的实例Dog
)object
的引用,而变量可以保存对object
实例的引用(或者派生自任何类的实例object
- Dog
该类一样).
如果有Dog
变量,则可以Dog
在引用的实例上调用由类(及其基类)定义的任何方法.如果有object
变量,则只能object
在实例上调用类的方法.
两个语句都包含声明和构造函数调用.构造函数的调用是相同的,因此Dog
在两种情况下都会得到一个.声明是不同的:在第一种情况下,声明一个类型的变量object
,一个超类Dog
; 在第二种情况下,您声明一个类型的变量Dog
.不同之处在于,在后续代码中,Dog
只有在将变量声明为Dog
; 时,才能调用不带强制转换的方法; 如果你声明它object
,你需要一个演员表.
归档时间: |
|
查看次数: |
1916 次 |
最近记录: |