1

如标记的那样,如果重要的话,我正在使用 Mono,而不是 .NET。

在使用委托时,我对范围的最佳实践感到困惑。请注意,在此示例中,autoOrientationsautoRotationSetups将在Awake()之外的类中的其他位置使用。另请注意,在使用Unity时,您经常使用Awake(),否则您可能会使用构造函数

List<ScreenOrientation> autoOrientations;
Dictionary<ScreenOrientation, Action> autoRotationSetups;

void Awake() {
    var verticalOrientations = new List<ScreenOrientation>(
        new []{ScreenOrientation.Portrait, ScreenOrientation.PortraitUpsideDown});  
    Action setAutoRotationsToVertical = () => {
        // I don't think this defintion is important for this question,
        // but it does use the just-defined List.
    };
    var horizontalOrientations = new List<ScreenOrientation>(
        new []{ScreenOrientation.LandscapeLeft, ScreenOrientation.LandscapeRight});
    Action setAutoRotationsToHorizontal = () => {// See last comment.
    };
    autoRotationSetups = new Dictionary<ScreenOrientation, Action>() {
        {ScreenOrientation.Portrait, setAutoRotationsToVertical},
        {ScreenOrientation.PortraitUpsideDown, setAutoRotationsToVertical},
        {ScreenOrientation.LandscapeLeft, setAutoRotationsToHorizontal},
        {ScreenOrientation.LandscapeRight, setAutoRotationsToHorizontal},
    }; //...

或者,我可以定义类方法,然后将它们分配给委托。这种改变看起来像:

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

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

这两种方法之间有什么不同的地方吗?以我目前的知识水平,我最关心的是存在错误的记忆区域的变量;关于价值类型的真相可能会澄清这一点,我想我很清楚,但我对它的理解还不够好,还不能完全自信。此外,我不知道采取一种或另一种方式的任何其他可能原因,因此这个问题。

我最近一直在关闭问题,因为人们认为它们是主观的,所以,尽管我重视你的意见,“不”。将是一个可以接受的答案。“是”可能需要进一步解释这不是纯粹的风格选择。

4

1 回答 1

3

这两种方法之间有什么不同的地方吗?

当您通过 lambda 表达式创建匿名方法时,编译器只会为您创建一个方法。实际上,这两个版本的差异可能很小。

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

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

我不会太担心这一点——它不像有一个“正确”和一个“错误”的记忆区域......

于 2012-06-29T15:19:58.570 回答