0

次の Winforms 階層があります。

Form ==> AForm ==> BForm

int? X;そして、 で定義された null 許容メンバーがありますAForm。にBFormは、次のコードがあります。

public partial class BForm : AForm, IBview
{
    ......
    public int Y
    {
        get
        {
            int z = X ?? 0;
            System.Diagnostics.Debug.WriteLine("X: " + X.ToString() + " z: " + z.ToString());
            return z;
        }
    }

Xnull であってはなりません。フォームを閉じて開こうとしていBFormます。通常は機能し、zゼロになることもあります (10 回に 1 回など)。z==0オンラインの条件付きブレークがありreturn zます。

ブレークポイントにヒットしたとき。デバッグ書き込み

    X:  z: 0

しかし、ブレークポイントがヒットした後にビジュアルスタジオでXマウスカーソルを合わせると、の値はnullでも0でもありません。X

4

2 に答える 2

0

BForm自体の初期化を確認してください。BFormがAFormから値を継承するからといって、それらの値を自分で設定しない限り、それらの値がAFormオブジェクトの他のインスタンスからの物理値を保持することを特に意味するわけではありません。

これは、BFormインスタンスの作成方法と関係があります。このようなもの:

AForm A = new Aform(someValueForX);
BForm B = A;

また

BForm B = new AForm(someValueForX);

このような場合、BXはAXと同じ値になり、継承ルールを使用して割り当てを許可する必要があります。ただし、Xが宣言のどこかで初期化されていない場合、AFormの他のインスタンスに値がある場合でも、Xは表示しているBFormの特定のインスタンスに値を持ちません。

于 2012-06-05T20:43:06.867 に答える
0

が nullable の場合、Xつまりint? X、その値は を介し​​て取得されX.Valueます。次のことも確認できます。

int z = X.HasValue ? X.Value : 0;

オプションで、キャストすることもできますX- (int)X- ただし、最初にキャストするかどうかを確認する必要がありますX.HasValue。それ以外の場合、X がまだ初期化されていない場合、null 例外が発生すると思います。

于 2012-06-05T20:00:44.607 に答える