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);