对象之间的区别a = new Dog()vs Dog a = new Dog()

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)

  • @Omkarpanhalkar,它获取实例的类型,而不是变量.这是一种运行时机制,用于获取与实例关联的元数据,运行时知道该实例是Dog.你丢失的是编译时的好处. (3认同)

dtb*_*dtb 6

new Dog()是一个创建新Dog实例的表达式.它调用类的无参数构造函数Dog.

a是一个变量:内存中的存储单元,Dog在分配后保存对实例的引用.

不同之处在于Dog变量只能保存对Dog实例(或派生自的任何类的实例Dog)object的引用,而变量可以保存对object实例的引用(或者派生自任何类的实例object- Dog该类一样).

如果有Dog变量,则可以Dog在引用的实例上调用由类(及其基类)定义的任何方法.如果有object变量,则只能object在实例上调用类的方法.


SLa*_*aks 5

您的第一行创建了一个类型的变量object.

编译器不会让你把它视为一个Dog.


das*_*ght 5

两个语句都包含声明和构造函数调用.构造函数的调用是相同的,因此Dog在两种情况下都会得到一个.声明是不同的:在第一种情况下,声明一个类型的变量object,一个超类Dog; 在第二种情况下,您声明一个类型的变量Dog.不同之处在于,在后续代码中,Dog只有在将变量声明为Dog; 时,才能调用不带强制转换的方法; 如果你声明它object,你需要一个演员表.