![](/img/trans.png)
[英]What's the difference between a property with a private setter and a property with no setter?
[英]Attach to Property's setter
我没有找到类似的帖子,所以我问这个。
假设我在某处定义了一个应用程序可用的静态属性(我的意思是它不是本地的),并且在一个类中我想知道何时更改此属性。 除了我认为不适合我的aop(透明代理等)之外,(无论如何我也不能将其添加到项目中),这里有什么选择?
我能想到的一种解决方案(可能是一个非常讨厌的解决方案)是使用将在setter中执行的某个事件,然后将其附加到需要该事件的类中。 就像是:
public static event EventHandler CurrentNumberChanged= delegate {};
public static int CurrentNumber
{
get
{
return currentNumber;
}
set
{
currentNumber = value;
CurrentNumberChanged(null, EventArgs.Empty);
}
}
我知道使用此类事件确实是不安全的( 在此处阅读 )。 而且由于我会在asp.net中使用它,因此使其更加难看。 您有什么建议吗?
您可以对Observer模式使用变体以达到相同的效果。 不确定您的线程要求是什么,我怀疑这会遭受与如何从静态类引发自定义事件类似的取消引用问题(尽管要花更多的时间才能解决该问题):
使用系统; 使用System.Collections.Generic;
命名空间ClassLibrary1 {公共类StaticObservable {私有static int currentNumber;
private static readonly List<IObserver> observers = new List<IObserver>();
public static int CurrentNumber
{
get{return currentNumber;}
set
{
currentNumber = value;
foreach (var observer in observers)
{
observer.NotifyChange();
}
}
}
public static void Attach(IObserver observer)
{
observers.Add(observer);
}
public static void Detach(IObserver observer)
{
observers.Remove(observer);
}
}
public interface IObserver
{
void NotifyChange();
}
public class ObserverImpl : IObserver
{
public void NotifyChange()
{
Console.Out.WriteLine("Number has changed");
}
}
public class AppWrapper
{
public static void Main (string[] args)
{
Console.ReadLine();
var observerImpl1 = new ObserverImpl();
var observerImpl2 = new ObserverImpl();
StaticObservable.Attach(observerImpl1);
StaticObservable.Attach(observerImpl2);
StaticObservable.CurrentNumber = 1;
Console.ReadLine();
}
}
}
您刚才提到的答案是,如果您忘记取消订阅静态事件的实例,则此实例将永远存在。
我认为EventHandler有点太多,为什么不只在需要接收消息的类中使用setter创建一些布尔标志,并且每当触发CurrentNumber的setter时,就调用该布尔标志的setter。
我想在这里进行更多描述,但是数据不足以建议实际代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.