跳到主要内容

阐述 C#装箱和拆箱?什么是重载?

参考答案:

C# 中的装箱和拆箱是值类型和引用类型之间转换的重要概念,而重载则是方法的一种特性,允许使用相同的方法名但不同的参数列表。下面分别详细解释这两个概念:

装箱(Boxing)和拆箱(Unboxing)

装箱是将值类型转换为引用类型的过程。在 C# 中,所有的值类型都继承自 System.ValueType,它是一个抽象类和 System.Object 的子类。由于值类型不是引用类型,所以不能直接存储在堆上,而是存储在栈上或作为对象的字段。但有时我们可能希望将值类型作为对象处理,例如将它添加到集合中或作为方法的参数传递,这时就需要进行装箱操作。

装箱操作会分配一个对象实例在堆上,并将值类型的值复制到新创建的对象中,然后返回对象的引用。这样,原本的值类型就被“包装”成了一个引用类型。

拆箱则是装箱的逆过程,即将引用类型转换回值类型。当我们从堆上的对象中取出值并赋值给栈上的变量时,就发生了拆箱操作。需要注意的是,拆箱操作必须确保引用类型实际上引用的是一个装箱后的值类型,否则会导致 InvalidCastException 异常。

示例:

int i = 10; // 值类型
object obj = i; // 装箱:将 int 转换为 object
int j = (int)obj; // 拆箱:将 object 转换回 int

重载(Overloading)

重载是指在同一个类中定义多个同名但参数列表不同的方法。编译器根据传入的参数类型和数量来确定调用哪个方法。这样可以提高代码的可读性和复用性,使得我们可以使用相同的方法名来表示相似的操作,但针对不同类型的参数或参数数量执行不同的逻辑。

示例:

public class MyClass
{
    public void MyMethod(int a)
    {
        Console.WriteLine("MyMethod with int parameter");
    }

    public void MyMethod(string s)
    {
        Console.WriteLine("MyMethod with string parameter");
    }

    public void MyMethod(int a, string s)
    {
        Console.WriteLine("MyMethod with int and string parameters");
    }
}

在这个例子中,MyMethod 被重载了三次,分别接受一个 int 参数、一个 string 参数和两个参数(一个 int 和一个 string)。当我们调用这个方法时,编译器会根据传入的参数类型和数量来确定调用哪个重载版本。