对象与函数

这篇博客探讨了C#中两种表示Point的方法:一种是传统的面向对象实现,定义为CPoint类;另一种是函数式编程方式,使用Func创建一个返回函数的函数。两种方式在输出上表现一致,但实现机制不同。文章通过实例展示了如何创建和使用这两种Point,并演示了调用它们获取坐标值的过程。
摘要由CSDN通过智能技术生成

这是一个很小的游戏,在这个游戏中我定义两种 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;
    }
}

输出:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值