Skip to content

C# 使用接口调用值类型的方法

🏷️ C#

如何避免在 C# 奇怪的值类型方法调用 中出现的预想外的情况呢?

最简单的当然是将 Point 类型由 struct 改为 class

仍然使用值类型时,则需要实现一个接口:

csharp
interface IChangeable
{
    void Change(int x, int y);
}

Point 类型引用该接口:

csharp
struct Point : IChangeable
{
    private int m_x, m_y;

    public Point(int x, int y)
    {
        m_x = x;
        m_y = y;
    }

    public void Change(int x, int y)
    {
        m_x = x;
        m_y = y;
    }

    public override string ToString()
    {
        return String.Format("( {0}, {1} )", m_x, m_y);
    }
}

调用时将 Object 型显示转换为接口类型再调用 Change 方法:

csharp
((IChangeable)o).Change(5, 5);
Console.WriteLine(o); // ( 5, 5 )

由于 IChangeable 也是引用类型,所以不会拆箱,改变的也就是 o 变量所指向的堆中的值,实现了预想中的效果,打印出来的值为 ( 5, 5 )

如果以下面的方式调用,打印的结果又是什么呢?

csharp
Point p1 = new Point(1, 1);
((IChangeable)p1).Change(4, 4);
Console.WriteLine(p1);