8.2.4 Type system unification
C# provides a .unified type system.. All types.including value
types.derive
from the type object. It is
possible to call object methods on any value, even values of
.primitive.
types such as int. The example
using System;
class Test
{
static void Main() {
Console.WriteLine(3.ToString());
}
}
calls the object-defined ToString method on an integer literal,
resulting
in the output .3..
The example
class Test { static void Main() { int i = 123;
object o = i; // boxing
int j = (int) o; // unboxing
}
}
is more interesting. An int value can be converted to object and back again
to int. This example shows
both boxing and unboxing. When a variable of a value type needs to be
converted to a reference type, an
object box is allocated to hold the value, and the value is copied into the
box. Unboxing is just the opposite.
When an object box is cast back to its original value type, the value is
copied out of the box and into the
appropriate storage location.
This type system unification provides value types with the benefits of
object-ness without introducing
unnecessary overhead. For programs that don.t need int values to act like
objects, int values are simply
32-bit values. For programs that need int values to behave like objects,
this capability is available on
demand. This ability to treat value types as objects bridges the gap
between value types and reference types
that exists in most languages. For example, a Stack class can provide Push
and Pop methods that take and
return object values.
public class Stack
{
public object Pop() {.}
public void Push(object o) {.}
}
Because C# has a unified type system, the Stack class can be used with
elements of any type, including
value types like int.
C# provides a .unified type system.. All types.including value
types.derive
from the type object. It is
possible to call object methods on any value, even values of
.primitive.
types such as int. The example
using System;
class Test
{
static void Main() {
Console.WriteLine(3.ToString());
}
}
calls the object-defined ToString method on an integer literal,
resulting
in the output .3..
The example
class Test { static void Main() { int i = 123;
object o = i; // boxing
int j = (int) o; // unboxing
}
}
is more interesting. An int value can be converted to object and back again
to int. This example shows
both boxing and unboxing. When a variable of a value type needs to be
converted to a reference type, an
object box is allocated to hold the value, and the value is copied into the
box. Unboxing is just the opposite.
When an object box is cast back to its original value type, the value is
copied out of the box and into the
appropriate storage location.
This type system unification provides value types with the benefits of
object-ness without introducing
unnecessary overhead. For programs that don.t need int values to act like
objects, int values are simply
32-bit values. For programs that need int values to behave like objects,
this capability is available on
demand. This ability to treat value types as objects bridges the gap
between value types and reference types
that exists in most languages. For example, a Stack class can provide Push
and Pop methods that take and
return object values.
public class Stack
{
public object Pop() {.}
public void Push(object o) {.}
}
Because C# has a unified type system, the Stack class can be used with
elements of any type, including
value types like int.
本文介绍了C#的统一类型系统,所有类型包括值类型都派生自object类型,可对任何值调用object方法。还展示了装箱和拆箱操作,这种统一类型系统让值类型具备对象特性且无额外开销,能弥合值类型和引用类型的差距,使Stack类可用于任何类型元素。

被折叠的 条评论
为什么被折叠?



