3

私は C# と XAML を使用してきましたが、キャスト後にクラスのメンバーにアクセスするためのより良い方法があるかどうか疑問に思っていました。これは、私が通常しなければならないことの例です。

private void MyButton_Clicked(object sender,  RoutedEventtArgs e)
{
    ((PlaneProjection)((Button)sender).Projection).RotationX = 20;
}

ボタンをクリックするたびにボタンを回転させますが、より複雑なアクションでは、より多くの括弧が必要になります. 少し読みやすくするために as を使用できることはわかっていますが、それでも次のようになります。

((sender as Button).Projection as PlaneProjection).RotationX = 20;

これは、私が望んでいるよりもまだ多くの括弧です。

私はこれを長い道のりで行っていますか、それとも何か不足していますか? それとも、これはそのままなので、このようなコードが読みにくくなる可能性に対処する必要がありますか?

4

4 に答える 4

1

(A) 厳密に言えば、いや、仕方がない。キャストを作成すると、別の型の一時的な値が残ります。通常のキャストであろうと AS 演算子であろうと、キャスト後に構文分岐はほとんど残りません。括弧に入れてすぐに使用するか、変数に格納する必要があります。

(B) 大まかに言えば、方法はあります。キャストをまったく行わないでください。ただし、次のようになることに注意してください。

  • 新しい .Net プラットフォームが必要
  • 安全性が低くなります (コンパイル時の名前チェックはオフです)
  • さらに安全性が低くなります (実行時の TYPE チェックはオフです。property-name が見つかった場合は、変数に含まれているオブジェクトの正確なタイプに関係なく、それが使用されます)
  • パフォーマンスが少し悪い (単純に、動的 ops はコンパイル済み ops よりも遅い)

さて、動的と言ったように、CLR4.0 動的式を使用します。

private void MyButton_Clicked(object sender,  RoutedEventtArgs e)
{
    dynamic tmp = sender;
    tmp.Projection.RotationX = 20;
}

しかし、括弧をスキップするためだけにそれを行うことは本当にお勧めしません..この式にはゼロの型チェックがあります。100%ダックタイピングです。ボタンの場合、ボタンの API が変更される可能性はほとんどないので問題ありません。ただし、頻繁に変更される独自のコードの場合は、注意してください。または、プロパティの存在に関する適切な単体テストを含めてください。

于 2013-02-07T15:15:24.717 に答える
1
var button = sender as Button;

if (button == null)
    return;

var projection = button.Projection as PlaneProjection;

if (projection == null)
    return;

projection.RotationX = 20;

キャストが NullReferenceException をスローしないようにしているため、はるかに安全な方法です。

Double X {get;set;}ただし、ボタンをバインドできるとを保持する ViewModel を作成しCommand、コード ビハインドで UI 要素を操作するのではなく、ViewModel を作成することをお勧めします。

于 2013-02-07T15:08:38.190 に答える
0

括弧とキャストのリードを取得する方法がわかりません。

分けていただけませんか

var planeProjection = (PlaneProjection)((Button)sender).Projection;

その後

planeProjection.RotationX = 20;
planeProjection.RotationY = 20;
planeProjection.RotationZ = 20;
于 2013-02-07T15:22:45.160 に答える
0

括弧が気に入らない場合は、代わりに変数を作成できます。

var button = (Button)sender; // or 'sender as Button'
var planeProjection = (PlaneProjection)button.Projection; // or 'button.Projection as PlaneProjection'
于 2013-02-07T15:07:56.407 に答える