C# 计时器作为结构的一部分
我有以下结构C# 计时器作为结构的一部分,c#,C#,我有以下结构 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
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();
我该怎么办?我会将其改写为:
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数据包含一个计时器,但您正在从另一个组件设置OnTimedEvent处理程序(在数据中定义)。有点不合逻辑。我会将其改写为:
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数据包含一个计时器,但您正在从另一个组件设置OnTimedEvent处理程序(在数据中定义)。位不逻辑。k;我现在明白错误信息了。在示例代码中,您有:
ret.aliveTimer.Elapsed += new ElapsedEventHandler(sData.OnTimedEvent);
这表明在您的真实代码中,OnTimedEvent
是static
——这解释了为什么您会收到消息(注释):
非静态字段、方法或属性“TimerTester.Form1.sData.volume”需要对象引用
所以,;最初的问题是OnTimedEvent
不应该是静态的
。这反过来意味着事件订阅将是:
ret.aliveTimer.Elapsed += new ElapsedEventHandler(ret.OnTimedEvent);
或者简单地说:
ret.aliveTimer.Elapsed += ret.OnTimedEvent;
然而!结构上的事件订阅是。。。有风险的结构的复制语义几乎不可能将它们正确地用作事件源或订阅者sData
显然不是一个“值”,因此它不应该是一个struct
:它应该是一个类。如果您有任何疑问,类
涵盖了99.99%的场景struct
非常罕见,正确使用时更为罕见,而不是认为struct
意味着“像类
但更便宜”(这不是它的意思)
我还想更改sData
的许多特性(包括名称、公共字段的使用、公开的实现细节等)——但这是两个大问题的次要原因:
- 对
struct
- 对
static
k;我现在明白错误信息了。在示例代码中,您有:
ret.aliveTimer.Elapsed += new ElapsedEventHandler(sData.OnTimedEvent);
这表明在您的真实代码中,OnTimedEvent
是static
——这解释了为什么您会收到消息(注释):
非静态字段、方法或属性“TimerTester.Form1.sData.volume”需要对象引用
所以,;最初的问题是OnTimedEvent
不应该是静态的
。这反过来意味着事件订阅将是:
ret.aliveTimer.Elapsed += new ElapsedEventHandler(ret.OnTimedEvent);
或者简单地说:
ret.aliveTimer.Elapsed += ret.OnTimedEvent;
然而!结构上的事件订阅是。。。有风险的结构的复制语义几乎不可能将它们正确地用作事件源或订阅者sData
显然不是一个“值”,因此它不应该是一个struct
:它应该是一个类。如果您有任何疑问,类
涵盖了99.99%的场景struct
非常罕见,正确使用时更为罕见,而不是认为struct
意味着“像类
但更便宜”(这不是它的意思)
我还想更改sData
的许多特性(包括名称、公共字段的使用、公开的实现细节等)——但这是两个大问题的次要原因:
- 对
struct
- 对
static
您的错误是什么?此外,为什么要使用struct而不是类?将其更改为类
?无论如何,可变的struct
s很少是个好主意。为什么要将它创建为struct
?在struct
上发生的事件通常是错误的。为什么这是一个结构
?如果您不能清楚地回答为什么它是一个结构,那么几乎可以肯定它不应该是一个。而一个带有公共字段的可变struct
只是在乞求解决问题。现在。。。“我不能在这里访问卷”是什么意思?@adam您发布的struct sData
代码编译得很好。您在发布代码时是否更改了代码?注意:它编译的事实并不意味着它是合理的代码;你犯了什么错误?此外,为什么要使用struct而不是类?将其更改为类
?无论如何,可变的struct
s很少是个好主意。为什么要将它创建为struct
?在struct
上发生的事件通常是错误的。为什么这是一个结构
?如果您不能清楚地回答为什么它是一个结构,那么几乎可以肯定它不应该是一个。而一个带有公共字段的可变struct
只是在乞求解决问题。现在。。。“我不能在这里访问卷”是什么意思?@adam您发布的struct sData
代码编译得很好。您在发布代码时是否更改了代码?注意:它编译的事实并不意味着它是合理的代码;pminor-tweak-我会把音量
变成一个自动道具;公共领域从来都不是一个好主意。现在还不清楚\u aliveTimer
将如何在这里获得非空值,或者它将如何被清除。小调整-我将使音量
成为一个自动道具;公共领域从来都不是一个好主意。目前尚不清楚\u aliveTimer
将如何在此处获得非空值,或者如何清除该值。