每当更改struct或object属性时,我都需要控制。它没有我可以使用的任何事件。
示例:如何知道宽度或高度何时发生变化?这甚至可能吗?
“System.Drawing.Size = Size”
private Size mySize;
public Size MySize
{
get {
//What if X or Y is changed?? I need to know that
return mySize;
}
set {
mySize = value;
}
}
对于这种特定情况,如果只读取Size属性,则问题将得到解决。但他们不是。
答案 0 :(得分:4)
编辑以回应评论:
示例:如何知道宽度或高度何时发生变化?这甚至可能吗?
不,这是不可能的。但是,没关系。
当您从班级返回Size
时,自Size
is a struct
起,您就会返回副本。即使用户更改了您返回的Width
的{{1}}或Height
,也不会影响您班级中的Size
结构。
为了改变你的尺寸,他们需要改变整个事物,即:
mySize
就您而言,var temp = yourClass.MySize;
temp.Width = newWidth;
yourClass.MySize = temp; // The user will need to assign an entire Size
属性实际上是只读的,因为Size
是值类型。
原始答案,假设Width和Height是用户类的属性:
有两个主要选项 -
您可以根据宽度和高度动态计算尺寸,而不是存储尺寸:
System.Drawing.Size
另一种选择是在属性设置器中为宽度和高度重新计算您的大小:
public Size MySize
{
get {
return new Size(Width,Height);
}
set {
Width = value.Width;
Height = value.Height; // Set Width/Height appropriately
}
}
最后,如果您使用public double Width
{
get { return width; }
set
{
width = value;
mySize = new Size(width, Height); // Compute new size, so it's always correct
}
}
之类的内容来跟踪更改,您还可以订阅自己的INotifyPropertyChanged
事件,如果它是相应的属性,请重新计算您的尺寸。
答案 1 :(得分:3)
简短回答 - 不,在字段更改时触发的普通旧C#对象上没有事件。
我知道你的选择:
请注意mutable struct considered evil - 尽量避免“只要struct
属性发生更改”这一情况。
答案 2 :(得分:1)
编辑在意识到它是一个结构:
考虑Eric Lippert在他的博客中关于Mutable Structs的精彩文章 Mutating Readonly Structs(Evil)
答案 3 :(得分:1)
您可以创建一个事件并在适当的Set方法中引发它。或者你可以查看这个链接,有两个例子: