分配相同值时未调用c#属性设置器

分配相同值时未调用c#属性设置器,c#,properties,setter,C#,Properties,Setter,我的属性文件名定义如下: private string _ggFileName = ""; public string ggFileName { get { return _ggFileName; } set { _ggFileName = value; ReadXmlSchemaFromFile();

我的属性文件名定义如下:

    private string _ggFileName = "";
    public string ggFileName
    {
        get 
        { 
            return _ggFileName;
        }
        set 
        {
            _ggFileName = value;
            ReadXmlSchemaFromFile();
        }
    }
将值分配给ggFileName时,方法ReadXmlSchemaFromFile();被称为。 到目前为止还不错

我的问题是,当我使用属性ggFileName已经包含的相同值分配属性ggFileName时,什么也不会发生。在我为setter分配不同的值之前,不会调用它

我同意,在几乎所有情况下,这都是完全合乎逻辑的,但在我的情况下,这会引发一个问题。 如果ggFileName中的文件在我的应用程序之外更改了怎么办? 将同一文件再次分配给ggFileName不会调用我的setter,因此也不会调用ReadXmlSchemaFromFile()。因此,现在我必须将一个虚拟文件设置为属性ggFileName,然后将同一个文件再次分配给ggFileName以使其工作

C#似乎想帮助我,在分配相同的值时不调用setter,我怎么能告诉C#停止帮助我

我不知道c#会这样做,在我所有的setter中我都有这样的代码: if(value!=\u myValue){do setter logic here} 我想我不需要再写那张支票了

只是为了让事情更清楚,因为人们似乎不理解我的问题。 1.我的setter确实会被调用,但只有在分配不同的值时才会被调用 2.我不想使用方法,因为在设置属性之后,我希望进行一些检查,并且我不希望我的类的任何其他用户能够通过该检查进行检查。这就是属性的用途,还是不? 3.分配一个我无法发布的值的代码。它是自定义控件的属性,由设计器通过编辑对象检查器调用。再说一次,只要我不断给它输入不同的值,它就会工作


非常感谢您所做的一切-我遇到了这个问题,在我们的代码库中,它归结为

Fody插入相等检查并使设定器短路。我真的没想到你的问题会落在福迪身上(因为你提到了视觉设计师)。我认为这可能对其他像我一样看到这篇文章的人有价值

我曾经发现代码被插入

为了您的利益,我使用dotPeek检查winforms PropertyGrid,并找到下面的代码片段。VisualStudio可能会有所不同,但我强烈怀疑它也在做类似的事情。如果您非常感兴趣,可以在设置不同的值时记录调用堆栈。调用堆栈中的某个地方将是具有相等检查的函数

private object SetPropertyValue(object obj, object objVal, bool reset, string undoText)
{
  DesignerTransaction designerTransaction = (DesignerTransaction) null;
  try
  {
    object propertyValueCore = this.GetPropertyValueCore(obj);
    if (objVal != null && objVal.Equals(propertyValueCore)) // if equal return!!!!
      return objVal;
    this.ClearCachedValues();
关于福迪:

这种在新指令中“编织”的技术令人难以置信 强大的您可以将简单的公共属性转换为完整属性 INotifyPropertyChanged实现,添加空参数检查, 将Git哈希添加到程序集,甚至生成所有字符串 比较不区分大小写


值得注意的是,它可以通过禁用。

问题出在visual studio的buggy designer中。 在designtime中使用“属性窗口”设置属性值时,如果属性中已有相同的值,则此窗口不会设置属性的值

在代码中执行此操作时没有问题,无论发生什么情况,都会设置该值


这是微软试图帮助您的另一个很好的例子(无论是向后帮助您,而不是向前帮助您……)

我今天在PropertyGrid中遇到了同样的问题。 我发现了一个简单的解决办法,虽然不完善,但对我来说是好的。我没有在getter中返回
\u ggFileName
,而是返回了“Browse File” 我确保不使用getter,而是使用字段

所以基本上唯一使用getter的是propery网格,当然它不是很好的编程,但是它很快就为我解决了问题

private string _ggFileName = "";
public string ggFileName
{
    get 
    { 
        return "Browze File";
    }
    set 
    {
        _ggFileName = value;
        ReadXmlSchemaFromFile();
    }
}

我认为在二传中这样做是个坏主意。为什么不添加一个方法呢?可以发布实际调用setter的代码吗?同意这种行为在属性中是不好的做法。使用一种方法。你不是在给你的字段赋值,而是在给引用赋值。为什么您认为您的应用程序的私有数据可以被某些第三方程序更改?属性的用途是允许您的类的用户设置私有值,并能够在设置该值时执行代码。因此,使用方法反而打破了设置值时必须执行某些代码的规则。这就是为什么使用属性而不是方法什么是Fody?正如我试图在上面描述的那样,问题出在VisualStudio的visual designer中。在代码中将相同的值指定给属性时,每次都会调用setter,但在使用对象检查器将相同的值指定给属性时,不会调用setter。在这种情况下,setter只有在给它另一个值时才被调用。我也遇到了同样的问题,而且是一个没有实现PropertyChanged属性的类,解决方案是从项目中删除fody。谢谢:)谢谢你提到福迪。其他人把福迪也包括在我们的项目中,我不明白为什么塞特没有被叫来!哇!我只是花了两个小时想弄明白这个疯狂的行为。。。非常感谢。有关此行为的fody配置的更多信息(如不检查孔projet):