C#游戏开发中的闭包写法和内联函数写法

C#闭包的最大问题并不是理解+如何用

这么大个人了,吃了那么多年的米饭,难道连个方法都不会写么

C#闭包最大的问题是,写法很抠搜,怎么写都好像可以又怎么写都不对

//而且好好像记错, lua写法了(不确定是不是对的,但就是唯一的写法)
funciton GetNumber()
    local isFirstRow  = function return true end
end

//lua 非常好写,实在牛逼,据说是巴西人发明的lua,和足球一样就是奔放

//而C# 呢。。。。。。。。。。。都是可以的,你会用那种呢你??
//写法1
bool isFirstElement() => ID == _listOfNearHandles[0].UniqueID;
//写法2
Func<bool> isFirstElement2 = () => { 
    return ID == _listOfNearHandles[0].UniqueID; 
};

//我好像经常把 Func, Action, Delegate 都搞混了,而action 很好用

c#最大的问题在于不好写。。。不好维护

在游戏中的问题,更多确实是批量执行 + Loop运行,闭包写法就是容易产生各种问题

数据处理C#也没python 厉害,所以某些前期,几十年的框架,确实是有人用Python 做游戏。。。js同理。。。js是要数据数据(自己的元数据都没有的)要UI,但是又想做复杂UI,做样式,js数据自己把自己玩死了。。。。。

//写法2
Func<bool> isFirstElement1 = () => {                 
    return _listOfNearHandles.Count!=0 && ID ==  _listOfNearHandles[0].UniqueID; 
};

内敛函数

C++ 中有个内联函数,使用 inline 来修饰函数,编译器就会对其进行优化,将此函数作为代码判断插入到调用处。

摘自 C语言中文网
函数调用在执行时,首先要在栈中为形参和局部变量分配存储空间,然后还要将实参的值复制给形参,接下来还要将函数的返回地址(该地址指明了函数执行结束后,程序应该回到哪里继续执行)放入栈中,最后才跳转到函数内部执行。这个过程是要耗费时间的。

另外,函数执行 return 语句返回时,需要从栈中回收形参和局部变量占用的存储空间,然后从栈中取出返回地址,再跳转到该地址继续执行,这个过程也要耗费时间。

而 C# 中可以通过在函数上使用特性,告诉编译器要对其进行优化,达到相同目的。

    [MethodImpl(MethodImplOptions.AggressiveInlining)]

示例如下:

using System;
using System.Diagnostics;
using System.Runtime.CompilerServices;

class Program
{
    const int _max = 10000000;
    static void Main()
    {
        int sum = 0;
        Stopwatch s1 = Stopwatch.StartNew();
        for (int i = 0; i < _max; i++)
        {
            sum += Method1();
        }
        s1.Stop();

        Stopwatch s2 = Stopwatch.StartNew();
        for (int i = 0; i < _max; i++)
        {
            sum += Method2();
        }

        s2.Stop();
        Console.WriteLine(((double)(s1.Elapsed.TotalMilliseconds * 1000000) /
            _max).ToString("0.00 ns"));
        Console.WriteLine(((double)(s2.Elapsed.TotalMilliseconds * 1000000) /
            _max).ToString("0.00 ns"));
        Console.Read();
    }

    static int Method1()
    {
        return "one".Length + "two".Length + "three".Length +
            "four".Length + "five".Length + "six".Length +
            "seven".Length + "eight".Length + "nine".Length +
            "ten".Length;
    }

    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    static int Method2()
    {
        return "one".Length + "two".Length + "three".Length +
            "four".Length + "five".Length + "six".Length +
            "seven".Length + "eight".Length + "nine".Length +
            "ten".Length;
    }
}

 转自

C# 中的内联函数 - 痴者工良的博客

参考:

 C# 基础学习2(内联函数,类型约束,try catch,vs调试)_c# 内lian函数-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值