1

タグ付けされているように、問題がある場合は、.NET ではなく Mono で作業しています。

デリゲートを使用する場合、スコープのベスト プラクティスについて混乱しています。この例では、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; //...

これら 2 つのアプローチの間で、ボンネットの下で何か異なることが起こっていますか? 私の現在の知識レベルでは、変数がメモリの間違った領域に存在することを主に懸念しています。値型についての真実はそれをクリアするかもしれません。また、どちらか一方に進む他の考えられる理由を認識していないため、この質問です。

最近、私は質問が主観的だと人々が考えたために閉じられているので、私はあなたの意見を尊重しますが、「いいえ」です. 受け入れられる答えでしょう。「はい」は、純粋に文体的な選択ではないことをさらに説明する必要があるでしょう。

4

1 に答える 1

3

これら 2 つのアプローチの間で、ボンネットの下で何か異なることが起こっていますか?

ラムダ式を使用して匿名メソッドを作成すると、コンパイラはメソッドを作成するだけです。現実的には、2 つのバージョンの違いはほとんどないでしょう。

主な違いは、コンパイラが匿名メソッドを作成できるようにすることで、Awake()メソッド内でローカルに定義された変数の周りにクロージャーを使用できるようになることです。これは、変数を保持するために余分なクラスが生成される可能性があるため、必要に応じて、良いことにも悪いことにもなります。

私の現在の知識レベルでは、メモリの間違った領域に変数が存在することを主に懸念しています

私はこれについてあまり心配しません-「正しい」メモリ領域と「間違った」メモリ領域があるようなものではありません...

于 2012-06-29T15:19:58.570 に答える