我有以下结构
private struct sData{
public int volume;
public System.Timers.Timer aliveTimer;
public void OnTimedEvent(object source, ElapsedEventArgs e)
{
Console.WriteLine("this = " + volume);// I cannot access volume here
}
}
当时间过去我想要改变音量值而我无法在OnTimedEvent中访问它 我使用此代码来启动结构和计时器:
sData ret = new sData();
ret.volume = rand.Next(1, 10) * 100;
ret.aliveTimer = new System.Timers.Timer(1000);
ret.aliveTimer.Elapsed += new ElapsedEventHandler(sData.OnTimedEvent);
ret.aliveTimer.Start();
我该怎么办?
答案 0 :(得分:2)
K表;我现在理解错误信息。在您的示例代码中,您有:
ret.aliveTimer.Elapsed += new ElapsedEventHandler(sData.OnTimedEvent);
表示在您的真实代码中,OnTimedEvent
为static
- 这解释了您收到消息的原因(评论):
非静态字段,方法或属性需要对象引用< TimerTester.Form1.sData.volume
因此;最初的问题是OnTimedEvent
不应该是static
。这反过来意味着事件订阅将是:
ret.aliveTimer.Elapsed += new ElapsedEventHandler(ret.OnTimedEvent);
或简单地说:
ret.aliveTimer.Elapsed += ret.OnTimedEvent;
然而!结构上的事件订阅是有风险的。结构的复制语义使得它几乎不可能正确地用作事件源或订阅者。 sData
明确不是"值",所以它根本不应该是struct
:它应该是class
。如果您有任何疑问,class
涵盖了99.99%的情景。 struct
非常罕见,甚至在使用正确时更为罕见,而不是认为struct
表示"如{{1}的人但更便宜" (这不是它的意思)。
我还会更改class
的许多功能(包括名称,公共字段的使用,公开的实现细节等) - 但这是次要的两个大问题:
sData
struct
答案 1 :(得分:1)
我会把它重写为:
private class Data{
public int Volume {get; set; }
private System.Timers.Timer _aliveTimer;
public Data()
{
_aliveTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
}
public void Start()
{
_aliveTimer.Start();
}
private void OnTimedEvent(object source, ElapsedEventArgs e)
{
Console.WriteLine("this = " + volume);
}
}
Data ret = new Data();
ret.Volume = rand.Next(1, 10) * 100;
ret.Start();
使用类总是比结构更好的主意。 Furthurmore Data包含一个计时器,但您正在设置另一个组件的OnTimedEvent处理程序(在Data中定义)。有点不合逻辑。