C# 访问堆栈对象 属性

C# access to stack object property

在这种情况下如何访问对象 属性?

Araba araba = new Araba();
araba.Renk = "mavi";
araba.fiyat = 12345;

// I created this class and it working normally
ArrayTypedStack asd = new ArrayTypedStack(10); 
asd.Push(araba);

object araba2 = asd.Pop();
araba2.  //cant access

此处您将 ​​asd.Pop() 的值分配给类型为 object 的变量。

object 是所有对象的根(所有对象都继承自它并可以转换为它),因此没有关于它是什么的真实信息。就像现实生活中的任何物体都是 thing.

此处的解决方案是将 araba2 声明为 Araba 类型,这样您就可以访问下一行的所有属性。

我不知道 ArrayTypedStack 的实现以及 Pop() 方法是什么样的(它是 return 类型)所以这可能会给你一个错误,说它不能将对象转换为 Araba 类型。这是 .NET 中实现的类型安全。您必须让 .NET 相信它是 Araba 类型,这可以通过转换

Araba araba2 = (Araba)asd.Pop();

如果从 Pop() 编辑的对象 return 不是 Araba 类型,这仍然会在运行时出错,在这种情况下,您可以要求 .NET 尝试要投射它,有几个选项:

object popResult = asd.Pop();
if (popResult is Araba) {
  Araba araba2 = (Araba)popResult;
}

// can be written as follows:
if (popResult is Araba araba3) {
  araba3.fiyat = 65432;
}

// can also be done as follows
Araba araba4 = asd.Pop() as Araba;
if (araba4 != null) {
  araba4.fiyat = 84368;
}

那么,您的 araba2 变量的类型是 object。因此,无论它包含的实例的实际类型如何,通过 object 变量 araba2 您只能访问由类型 object 提供的成员。 =23=]

要访问 Araba 类型提供的成员(并假设 araba2 变量中的实例是类型 Araba 的实例),araba2 变量本身应该是 Araba 类型,或者 araba2 的值需要转换为 Araba.

因此,

var araba2 = asd.Pop();

var araba2 = (Araba) asd.Pop();

上面的第一个示例代码行要求 Pop 方法的 return 类型是 Araba(或从 Araba).无论 Pop 的 return 类型如何,只要由 Pop[=41= 编辑的值 return ,后一个代码行示例都可以工作] 是一个实际的 Araba 实例(或者是可以转换为 Araba 实例的东西)。