这是一个很小的游戏,在这个游戏中我定义两种 Point,第一种,把Point看做对象,我定义为 CPoint:
class CPoint
{
public int X;
public int Y;
public CPoint(int x, int y)
{
X = x;
Y = y;
}
}
第二种,把Point视为函数:一个可以输入坐标名称,然后返回一个函数的函数,而返回的函数可用于求解对应坐标值。这种Point,我定义为FPoint:
Func<int, int, Func<string, Func<int>>> new_FPoint = (x, y) => dim => dim switch
{
"X" => () => x,
"Y" => () => y,
_ => throw new InvalidOperationException(),
}
最后分别创建这两种Point的实例,并打印它们,这里除了调用的形式不同以外,输出没有任何差别:
var p1 = new CPoint(1, 0);
var p2 = new CPoint(0, 1);
var p3 = new_FPoint(1, 0);
var p4 = new_FPoint(0, 1);
Console.WriteLine($"p1 = ({ p1.X},{p1.Y })");
Console.WriteLine($"p2 = ({ p2.X},{p2.Y })");
Console.WriteLine($"p3 = ({ p3("X")()},{p3("Y")() })");
Console.WriteLine($"p4 = ({ p4("X")()},{p4("Y")() })");
完整的程序:
//Program.cs
//为了遵循 .Net6 的规则,class CPoint 必须定义在所有顶级语句的最后
Func<int, int, Func<string, Func<int>>> new_FPoint = (x, y) => dim => dim switch
{
"X" => () => x,
"Y" => () => y,
_ => throw new InvalidOperationException(),
};
var p1 = new CPoint(1, 0);
var p2 = new CPoint(0, 1);
var p3 = new_FPoint(1, 0);
var p4 = new_FPoint(0, 1);
Console.WriteLine($"p1 = ({ p1.X},{p1.Y })");
Console.WriteLine($"p2 = ({ p2.X},{p2.Y })");
Console.WriteLine($"p3 = ({ p3("X")()},{p3("Y")() })");
Console.WriteLine($"p4 = ({ p4("X")()},{p4("Y")() })");
class CPoint
{
public int X;
public int Y;
public CPoint(int x, int y)
{
X = x;
Y = y;
}
}
输出: