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