C# 委托定义-内部/外部方法有什么区别?

C# 委托定义-内部/外部方法有什么区别?,c#,delegates,mono,C#,Delegates,Mono,如标签所示,我使用的是Mono,而不是.NET,如果有必要的话 在使用代理时,我对范围的最佳实践感到困惑。请注意,在本例中,autoOrientations和autoRotationSetups将在类中的其他位置(Awake()之外)使用。还请注意,在使用时,您通常会: 列出自动定向; 字典自动旋转设置; 无效唤醒(){ var Verticalentations=新列表( 新[]{ScreenOrientation.cription,ScreenOrientation.criptionUpsi

如标签所示,我使用的是Mono,而不是.NET,如果有必要的话

在使用代理时,我对范围的最佳实践感到困惑。请注意,在本例中,autoOrientations和autoRotationSetups将在类中的其他位置(Awake()之外)使用。还请注意,在使用时,您通常会:

列出自动定向;
字典自动旋转设置;
无效唤醒(){
var Verticalentations=新列表(
新[]{ScreenOrientation.cription,ScreenOrientation.criptionUpsideDown});
操作集AutoRotationStovertical=()=>{
//我不认为这个定义对这个问题很重要,
//但它确实使用了刚刚定义的列表。
};
变量水平方向=新列表(
新[]{ScreenOrientation.LandscapeLeft,ScreenOrientation.LandscapeRight});
Action setAutoRotationsToHorizontal=()=>{//请参阅最后一条注释。
};
自动旋转设置=新字典(){
{ScreenOrientation.graphic,将自动旋转设置为垂直},
{ScreenOrientation.graphics upsidedown,setAutoRotationsToVertical},
{ScreenOrientation.LandscapeLeft,将自动旋转设置为水平},
{ScreenOrientation.LandscapeRight,将自动旋转设置为水平},
}; //...
或者,我可以定义类方法,然后将它们分配给委托。这种更改如下所示:

List<ScreenOrientation> verticalOrientations, horizontalOrientations;
void SetAutoRotationsToVertical() {}
void SetAutoRotationsToHorizontal() {}

void Awake() {
    Action setAutoRotationsToVertical = SetAutoRotationsToVertical;
    Action setAutoRotationsToHorizontal = SetAutoRotationsToHorizontal; //...
列出垂直方向、水平方向;
void SetAutoRotationsToVertical(){}
void SetAutoRotationsToHorizontal(){}
无效唤醒(){
Action setAutoRotationsToVertical=setAutoRotationsToVertical;
Action setAutoRotationsToHorizontal=setAutoRotationsToHorizontal;//。。。
这两种方法之间有什么不同之处吗?在我目前的知识水平上,我最关心的是生活在错误记忆区域的变量;可能会澄清这一点,我认为我是清楚的,但我还没有完全自信地理解它。此外,我也不知道还有什么其他可能为什么要走这条路或那条路,这就是问题所在

我最近一直在问一些问题,因为人们认为这些问题是主观的,所以,尽管我重视你的观点,“不”是一个可以接受的答案。“是”可能需要进一步解释,这不是纯粹的文体选择

这两种方法之间有什么不同之处吗

当您通过lambda表达式创建匿名方法时,编译器只会为您创建一个方法。实际上,这两个版本可能没有什么区别

主要区别在于,通过允许编译器创建匿名方法,您确实可以在
Awake()中的本地定义变量周围使用闭包
method。这可能是一件好事,也可能是坏事,这取决于您想要什么——因为它可能会导致生成额外的类来保存变量

在我目前的知识水平上,我最关心的是生活在错误记忆区域的变量


我不会太担心这件事——这不像是“对”和“错”内存区域…

谢谢!提到闭包让我来到这里,这对我帮助很大:@Jessy注意,第一个选项并不意味着你一定会得到闭包-只有当你使用在匿名方法之外定义的变量时才会发生闭包。如果你将所有内容都保持在本地(即:它与“普通方法”相同),两者实际上是相同的。
List<ScreenOrientation> verticalOrientations, horizontalOrientations;
void SetAutoRotationsToVertical() {}
void SetAutoRotationsToHorizontal() {}

void Awake() {
    Action setAutoRotationsToVertical = SetAutoRotationsToVertical;
    Action setAutoRotationsToHorizontal = SetAutoRotationsToHorizontal; //...