C# 为什么将类实例传递给接受对象作为参数并将其装箱回来的方法

标签 c# object parameter-passing

例如,让我们考虑以下示例。

 class A
 {
  int i;
  string j;
  double t;
 }

 A a =new A();
 MethodCalled(a);

 void Method(object a)
 {
  A newA = a as A; // This will work even though Class A is down casted to System.Object
 }

谁能帮我理解一下。解释的链接引用?

谢谢

最佳答案

我没有看到任何拳击进行。装箱是将值类型(例如 int)转换为引用类型。在您的示例中,传递给方法的值是引用类型(class A)。拳击链接:

http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx

因此,当您调用 Method(或 MethodCalled,我认为这是一个错字)时发生的所有事情是该方法正在接受 A 类类型的参数 因为它是一个对象。所有引用类型都派生自 object

我认为您的问题实际上可以归结为“'as' 运算符的作用是什么?”这行代码:

A newA = a as A;

逻辑上翻译成这个伪代码:

A newA = null;
if (a can be cast to type A)
    newA = a;

因此您可以看到“as”运算符将正确设置 newA,因为参数的类型实际上是 A 类。如果您传递了另一个 class B 类型的对象,则 as 运算符将返回 null (假设 class B 不是从 class A 派生的)。这是 as 运算符示例的链接,这可能有助于更好地解释:

http://msdn.microsoft.com/en-us/library/cscsdfbt.aspx

关于C# 为什么将类实例传递给接受对象作为参数并将其装箱回来的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7313940/

相关文章:

c# - 如何根据浏览器文化将特定的 CSS 文件链接到母版页?

java - Java 是 "pass-by-reference"还是 "pass-by-value"?

c# - WinRT XAML - 如何设置 ListView 中所选项目的样式?

c# - 当两个值都添加了字符串时,如何执行 Linq LIKE 或 Contains

c# - 在 C# 中查找多个列表中的公共(public)项

java - 如何知道从另一个android应用程序可读的可能参数

java - Java参数引用和原始引用(不是对象)如何相同?

ios - NSNumber 实例不会保留值

Java 对象 makenew 对象覆盖当前对象

javascript - 有没有可能让 JSON.stringify 保留函数?