我是Unity的新手,我不太了解它。但是,我过去曾经玩过Java和Objective-C;两种面向对象的基于C语言的编程语言,非常类似于C#Unity使用的。
Objective-C有blocks个变量,允许您在其中存储函数并稍后调用它们。在实践中使用时,您可以使用块作为函数参数和类属性,保存程序员“if
”语句,而只是调用块。
该语法的一个例子是(摘自链接的教程网站):
// Declare a block variable
double (^distanceFromRateAndTime)(double rate, double time);
// Create and assign the block
distanceFromRateAndTime = ^double(double rate, double time) {
return rate * time;
};
// Call the block
double dx = distanceFromRateAndTime(35, 1.5);
NSLog(@"A car driving 35 mph will travel %.2f miles in 1.5 hours.", dx);
Java有Runnable
类,它是多线程结构的基础。 (Thread
继承自Runnable
。)我从previous question我问过这个课程。制作Runnable
的方法有两种:Java 8使用lambdas的方法......
Runnable r = () -> { System.out.println("This is just an example!"); }
Java 8使用lambdas作为函数参数...
void someFunction(Runnable r) {
r.run();
}
// In a method, not sure about the semicolons
someFunction( () -> { System.out.println("This will work, too!"); });
最后,Java 8之前......
Runnable r = Runnable(){
@Override
public void run() {
System.out.println("Yet another example");
}
}
我的问题是,我将如何在Unity的C#变种中实现这一目标?
答案 0 :(得分:3)
Action委托是等效的,没有多线程方面。您可以通过指定参数列表'=>'来使用表达式符号,然后是结果表达式,也可以是块。如果返回类型为非void,则可以使用Func。
Action a = () => Console.WriteLine("a");
Action b = x => Console.WriteLine(x);
Action c = (x, y, z) => {
Console.WriteLine(x);
Console.WriteLine(y);
Console.WriteLine(z);
}
Func<int, int, int> add = (x, y) => x + y; // last type is return-type
许多多线程库将接受动作和函数作为参数,包括核心TPL,其中包括Task.Run
和Task.ForEach
等方法。在操作os集合时,PLINQ扩展(Parallel Linq)是一个很好的工具,可以将函数链接在一起。
答案 1 :(得分:2)
在C#中称为Action
,您使用lambda运算符=>
:
Action action = () => Console.WriteLine("This is just an example!");
您也可以传递它:
// single line statement doesn't need to be wrapped in a {code block}, and you don't need the `;` at the end
SomeFunction(() => Console.WriteLine("This will work, too!"));
SomeFunction(() =>
{
//multiline statements
Console.WriteLine("This will work, too!");
Console.WriteLine("This will work, too!x2");
Console.WriteLine("This will work, too!x3");
});
void SomeFunction(Action action)
{
action();
}