Cha*_*lie 1 c# events unboxing object
我正在学习高级C#.在下面的代码中,我正在尝试进行事件处理
我在取消装箱后访问类发件人的成员时遇到错误//编译器不允许我使用这些名称
// Console.WriteLine("Sender is {0} and message is {1}",obj.name,obj.messgae);
Run Code Online (Sandbox Code Playgroud)
为什么会这样?这就是我们所说的拳击和拆箱,如果我不会感到困惑.
在我到目前为止所做的所有示例中,都有事件类继承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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
善意评论我的编码风格和含糊之处.提前致谢
这就是问题:
object obj=new object();
obj=sender as Sender;
Run Code Online (Sandbox Code Playgroud)
第二行不改变编译时类型的obj.它仍然只是object.(并且你创建一个新的第一行object是完全没有意义的.)编译器不关心你在obj尝试使用时所做的事情obj.name- 它关心编译时类型.你要:
Sender obj = (Sender) sender;
Run Code Online (Sandbox Code Playgroud)
(请参阅我最近的博客文章,了解为什么演员比as在这里使用更合适.)
你也想使用的公共属性,而不是私有字段:
Console.WriteLine("Sender is {0} and message is {1}", obj.Name, obj.Message);
Run Code Online (Sandbox Code Playgroud)
请注意,顺便说一下,这个转换不是拆箱 - 你没有涉及任何值类型(Sender是一个类)所以不涉及装箱或拆箱.
| 归档时间: |
|
| 查看次数: |
135 次 |
| 最近记录: |