我正在使用Visual Studio以C#语言创建一个应用程序。当变量的值为1时,我希望创建一些代码来执行某个操作。
我知道我可以使用if语句来实现,但问题是该值将在异步过程中更改,因此在该值更改之前,if语句可能会被忽略。
是否可以创建事件处理程序,以便在变量值更改时触发事件?如果可以,如何做到这一点?
完全有可能我误解了if语句的工作原理!非常感谢您的任何帮助。
我正在使用Visual Studio以C#语言创建一个应用程序。当变量的值为1时,我希望创建一些代码来执行某个操作。
我知道我可以使用if语句来实现,但问题是该值将在异步过程中更改,因此在该值更改之前,if语句可能会被忽略。
是否可以创建事件处理程序,以便在变量值更改时触发事件?如果可以,如何做到这一点?
完全有可能我误解了if语句的工作原理!非常感谢您的任何帮助。
看起来你想要创建一个属性。
public int MyProperty
{
get { return _myProperty; }
set
{
_myProperty = value;
if (_myProperty == 1)
{
// DO SOMETHING HERE
}
}
}
private int _myProperty;
这允许你在属性值改变时运行一些代码。如果你愿意,你可以在这里触发一个事件。
private int _age;
//#1
public event System.EventHandler AgeChanged;
//#2
protected virtual void OnAgeChanged()
{
if (AgeChanged != null) AgeChanged(this,EventArgs.Empty);
}
public int Age
{
get
{
return _age;
}
set
{
//#3
_age=value;
OnAgeChanged();
}
}
这种方法的优点是,您允许任何想要继承您的类并在必要时更改行为的其他类。
如果您想在引发事件的不同线程中捕获事件,则必须小心,不要更改在另一个线程中定义的对象的状态,否则会引发跨线程异常。为了避免这种情况,您可以对要更改其状态的对象使用Invoke方法,以确保更改发生在引发事件的相同线程中,或者如果您正在处理Windows窗体,则可以使用BackgroundWorker在并行线程中轻松进行操作。
public class MyClass : INotifyPropertyChanged
{
private object _lock;
public int MyProperty
{
get
{
return _myProperty;
}
set
{
lock(_lock)
{
//The property changed event will get fired whenever
//the value changes. The subscriber will do work if the value is
//1. This way you can keep your business logic outside of the setter
if(value != _myProperty)
{
_myProperty = value;
NotifyPropertyChanged("MyProperty");
}
}
}
}
private NotifyPropertyChanged(string propertyName)
{
//Raise PropertyChanged event
}
public event PropertyChangedEventHandler PropertyChanged;
}
public class MySubscriber
{
private MyClass _myClass;
void PropertyChangedInMyClass(object sender, PropertyChangedEventArgs e)
{
switch(e.PropertyName)
{
case "MyProperty":
DoWorkOnMyProperty(_myClass.MyProperty);
break;
}
}
void DoWorkOnMyProperty(int newValue)
{
if(newValue == 1)
{
//DO WORK HERE
}
}
}
希望这对你有所帮助 :)只需使用一个属性即可。
int _theVariable;
public int TheVariable{
get{return _theVariable;}
set{
_theVariable = value;
if ( _theVariable == 1){
//Do stuff here.
}
}
}
您可以使用通用类:
class Wrapped<T> {
private T _value;
public Action WillChange;
public Action DidChange;
public T Value
{
get => _value;
set
{
if ( _value != value )
{
OnWillChange();
_value = value;
OnDidChanged();
}
}
}
protected virtual void OnWillChange() => WillChange?.Invoke();
protected virtual void OnDidChange() => DidChange?.Invoke();
}
并且将能够执行以下操作:
var i = new Wrapped<int>();
i.WillChange += () => { Console.WriteLine("will be changed!"); };
i.DidChange += () => { Console.WriteLine("changed!"); };
i.Value = 10;
i.Value = 11;
i.Value = 10;
i.Value = 11;
Console.ReadKey();
结果:
will be changed!
changed!
will be changed!
changed!
will be changed!
changed!
will be changed!
changed!
OnValueChanged();
。这似乎是一种编程错误,会破坏你的代码。 - Zun
using System;
public string Name{
get{
return name;
}
set{
name= value;
OnVarChange?.Invoke();
}
}
private string name;
public event System.Action OnVarChange;