Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以知道对象属性何时更改?_C#_Properties - Fatal编程技术网

C# 是否可以知道对象属性何时更改?

C# 是否可以知道对象属性何时更改?,c#,properties,C#,Properties,无论何时更改结构或对象属性,我都需要进行控制。它没有我可以使用的任何事件 示例:如何知道宽度或高度何时更改?这可能吗 “System.Drawing.Size=尺寸” 对于这种特定的情况,如果大小属性是只读的,那么问题将得到解决。但它们不是。在意识到它是一个结构后编辑: 以Eric Lippert在其博客中关于可变结构的精彩文章为例 看看 和根据评论编辑: 示例:如何知道宽度或高度何时更改?这可能吗 不,这是不可能的。然而,这并不重要 当您从类中返回大小时,因为,您返回的是一份副本。即使用户更

无论何时更改结构或对象属性,我都需要进行控制。它没有我可以使用的任何事件

示例:如何知道宽度或高度何时更改?这可能吗

“System.Drawing.Size=尺寸”


对于这种特定的情况,如果大小属性是只读的,那么问题将得到解决。但它们不是。

在意识到它是一个结构后编辑:

以Eric Lippert在其博客中关于可变结构的精彩文章为例

看看


根据评论编辑:

示例:如何知道宽度或高度何时更改?这可能吗

不,这是不可能的。然而,这并不重要

当您从类中返回
大小时,因为,您返回的是一份副本。即使用户更改您返回的
大小的
宽度
高度
,也不会影响类中的
mySize
结构

为了改变你的尺寸,他们需要改变整个东西,即:

var temp = yourClass.MySize;
temp.Width = newWidth;
yourClass.MySize = temp; // The user will need to assign an entire Size
就您而言,
Size
属性实际上是只读的,因为
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
   }
}
另一个选项是在属性设置器中重新计算宽度和高度的大小:

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
的东西来跟踪更改,您还可以订阅自己的
PropertyChanged
事件,如果它是适当的属性,则重新计算您的大小。

简短回答-不,当字段更改时,不会在普通的旧C#对象上触发任何事件

我知道你的选择:

  • 将您的类(如果可以)更改为激发事件
  • 从类继承并在派生类中编写事件触发代码(假设可以使用虚拟get/set)
  • 将属性提取到接口中,在整个代码中使用该接口,并为触发属性更改的通用接口构建包装器

请注意-尽量避免“每当
struct
属性更改时”这种情况。

您可以创建一个事件,并使用适当的Set方法引发它。或者,您可以检查此链接,其中有两个示例:


您可以在那里创建自己的活动。NET有一个
OnPropertyChanged
事件,您可以将其用作基础。Size是您的类还是来自框架?您可能需要使用@cadrell0,Size是来自的结构。NET@GarrisonNeely是的,我知道。但是大小是一个结构,它没有属性更改事件。所以,如果有人改变宽度或高度,我的班级将不会意识到。是的,我知道。但是Size是一个结构,它没有实现这个接口。所以,如果有人更改宽度或高度,我的类将不会意识到。框架本身不提供这样的选项,您必须实现一个。如果有人更改宽度或高度,我的类将不会意识到。这就是问题所在。@Pedro77宽度和高度也是你们班的一部分吗?如果是这样的话,只需将它们设置为属性,它们更改它的唯一方法就是让您知道它…不,它们是.NET大小结构的一部分。@Pedro77用户不能直接在您的大小上设置宽度和高度-大小是一个结构,这意味着您的属性将返回一个副本,因此他们无法更改宽度和高度。解决方案是创建一个新的大小类,如“class MySize”,它在属性更改时实现事件。它不可能使用旧的尺寸结构,因为宽度或高度可以在我的课堂之外改变。我希望有一个解决这个问题的办法。