1

私は高度な C# を学習しています。次のコードでは、イベント処理を実行しようとしています。

ボックス化解除後にクラス送信者のメンバーにアクセスしているときにエラーが発生します//コンパイラはこれらの名前を使用できません

//    Console.WriteLine("Sender is {0} and message is {1}",obj.name,obj.messgae);

どうしてこんなことに?私が混乱していなければ、それは私たちがボクシングとアンボクシングと呼んでいるものですか。

これまでに行ったすべての例では、EventArgs を継承するイベント クラスがあります。そのクラスの必要性.ここではこのクラスを使用していませんが、代わりに Eventargs を直接使用しました(作成したばかりです)。

      namespace ConsoleApplication5
    {
        class eventclass : EventArgs
        {
            string var;
        }
        delegate void GenerateEvent(object source, EventArgs e);
        class Sender
        {
            public void MyMethod()
            {
                Console.WriteLine("My method Called");

            }
            private string name;
            public string Name
            {
                get
                {
                    return name;
                }
                set
                {
                    name = value;
                }
            }

            private string message;
            public string Message
            {
                get
                {
                    return message;
                }
                set
                {
                    message = value;
                }
            }
            public event GenerateEvent OnAlert;

            public void Sendit()
            {
                Console.WriteLine("Sender: Sending Message Now");
                OnAlert(this, new EventArgs());
                Console.WriteLine("Sender: Message Sent");

            }
        }
        class Receiver
        {
            public static void ReceiveMsg(object sender, EventArgs e)
            {
                Console.WriteLine("Receiveing Message");
                object obj = new object();
                obj = sender as Sender;

                /*Here i get Error while accessing members of class sender after unboxing 
                //Compiler is not letting me use these names
                //    Console.WriteLine("Sender is {0} and message is {1}",obj.name,obj.messgae);

                */


                Console.WriteLine("Received" + obj.GetType());
            }

        }
        class Program
        {
            static void Main(string[] args)
            {
                Receiver r = new Receiver();
                Sender s = new Sender();
                s.OnAlert += new GenerateEvent(Receiver.ReceiveMsg);
                s.Sendit();

            }
        }
    }

私のコーディング スタイルとあいまいさについて親切にコメントしてください。前もって感謝します

4

3 に答える 3

8

これが問題です:

object obj=new object();
obj=sender as Sender;

2 行目は、 のコンパイル時の型を変更しませんobj。まだですobject。(そして、 new を作成する最初の行は完全に無意味です。) コンパイラは、使用しようとしたときにobject何をしたかは気にしません。コンパイル時の型を気にします。あなたがしたい:objobj.name

Sender obj = (Sender) sender;

(ここでの使用よりもキャストの方が望ましい理由については、最近のブログ投稿asを参照してください。)

また、プライベート フィールドではなくパブリック プロパティを使用する必要があります。

Console.WriteLine("Sender is {0} and message is {1}", obj.Name, obj.Message);

ちなみに、このキャストはボックス化解除ではないことに注意してください-値の型が含まれていない(Senderクラスである)ため、ボックス化やボックス化解除は含まれていません。

于 2013-09-20T13:07:49.973 に答える
2

あなたの問題は、あなたがobj=sender as Sender;のタイプを変更すると仮定していることですobj。ならない。宣言された元の型のままになりますobject。ここ:object obj = new object();

交換:

object obj = new object();
obj= sender as Sender;

と:

var obj = sender as Sender;

または、単にキャストすることもできます:

((Sender)obj).MySenderProperty
于 2013-09-20T13:08:49.123 に答える
0

Sender をクラス名として使用するのは悪い考えですが、Sender クラスのオブジェクトを取得する正しい方法は次のとおりです。

Sender obj = sender as Sender;

しかし、私が言ったように、あなたの例の「オブジェクト送信者」のように一般的に使用される名前は避けてください。

于 2013-09-20T13:11:03.740 に答える