【问题标题】:C#: how to and how not to initialize an object? [closed]C#:如何以及如何不初始化对象? [关闭]
【发布时间】:2016-05-27 20:28:49
【问题描述】:

这个问题比通常的堆栈溢出问题更具理论性。 我的问题是:如果 A 类从 B 类继承,如果它们都有一个空的构造函数(无参数),那么初始化对象的正确方法是什么?

这是选项:

  1. A a = 新 B();
  2. B b = 新 A();
  3. A a = new B() as A;
  4. B b = new A() as B;

我认为 1 和 3 都是可能的,但我真的不确定。 谁能解释一下哪些是正确的,为什么?

【问题讨论】:

  • 你到底想做什么?
  • @AD.Net :这些是示例考试中的问题,我正在为它做准备,所以我真的很想确定它。 :D
  • @dbugger : 所以它和 1 一样?他们是对的吗?
  • @AlexeiLevenkov - 哦。向后。

标签: c# constructor initialization new-operator


【解决方案1】:

简短回答:视情况而定。

如果您想要A 类型的对象,则使用构造函数A()。如果您想要B 类型的对象,请使用构造函数B()

为了更具体一些,这里是动物类。

public class Giraffe : Animal {}
public class Animal {}

那么你的代码就变成了

Animal a = new Giraffe(); // perfectly normal, imo
//Giraffe  b = new Animal(); compiler error!
Animal a = new Giraffe() as Animal; // "as Animal" is redundant
Giraffe  b = new Animal() as Giraffe; // this is strange, but compiler is OK with it... not sure of a use case for this exact piece of code.

变量的类型并不意味着什么,除非你在一个类上公开一个字段或属性。在这种情况下,请考虑该对象在外人眼中的外观。如果您希望外界将您的字段/属性视为Animal 类型的对象,请使用它。 Giraffe 类型相同。

【讨论】:

  • 感谢您的回答,但除了应该让用户清楚什么是正确的方法之外,它们都是可能的还是只是一些可能的?
  • 查看我的修改。通过“可能”,我认为这是编译器允许您执行的操作。请记住,在 C# 的情况下,“类型”对于生成 CLR 代码确实很有用。一旦对象被创建,那么它“真的”是一个AnimalGiraffe,基于它拥有的实际字段。我认为a question I asked a while ago may help.
  • 好的,谢谢你的修改,它清理了很多:)
  • 没问题:)。您的问题被否决了,因为它不符合 SO 关于什么是问答网站的好问题的准则。不过,总的来说,我认为这是一个很好的问题。不要让选票让你失望​​
猜你喜欢
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多