当前位置: 首页 > 编程语言 > C#

修改成员时不调用C#对象设置器分享

时间:2023-04-10 23:40:46 C#

C#修改成员时不调用对象设置器我有如下包装类:publicclassWrapper{publicintMember;在另一个类中,我有以下内容:publicclassContainerClass{privateWrapperdata;publicWrapperProperty{get{返回数据;}设置{数据=值;}}publicvoidFoo(){Property.Member=42;}}修改Foo().Member中的属性,没有任何反应(跳过setter)。但是,我仍然可以这样做:publicvoidFoo(){Property=Property;}并放入所需的二传手。所以我的问题是,为什么修改对象属性的成员不调用该属性的设置器?因为你没有设置Property的值。您的代码只是调用属性的getter,然后设置Member字段的值(如果它是一个属性,将调用Member的setter,但这里不是这种情况)。如果想在设置Member的时候执行代码,需要做publicclassWrapper{privateintmember;publicintMember{get{returnthis.member;}设置{this.member=value;做一点事();}}}或更优雅的解决方案是使用事件。内置的INotifyProperyChanged接口为您提供了一个非常好的模板。使用System.ComponentModel;公共类包装器:INotifyPropertyChanged{公共事件PropertyChangedEventHandlerPropertyChanged;私有整数成员;publicintMember{get{returnthis.member;}设置{this.member=value;this.OnPropertyChanged("会员");}protectedvoidOnPropertyChanged(stringname){PropertyChangedEventHandlerhandler=PropertyChanged;if(handler!=null){handler(this,newPropertyChangedEventArgs(name));}}}publicclassContainerClass{privateWrapper数据;publicWrapperProperty{get{返回数据;}设置{数据=值;}}publicvoidFoo(){data.PropertyChanged+=data_PropertyChanged;财产.成员=42;}privatevoiddata_PropertyChanged(objectsender,PropertyChangedEventArgse){if(e.PropertyName=="Member"){DoStuff();}}}因为你没有修改引用。您正在修改引用的成员。例如,如果我站在房间的角落里说“拿着这个苹果”。如果我进来把苹果换成香蕉……我还没有换你,所以你可以走了。但如果我和别人出去,你会抱怨我取代了你。..不管怎样,这是我的类比。此外,您还为我添加了一个类...这通常用于.NET域中的接口。编辑:我意识到如果我拿着一块水果站在角落里......当我取代你时你可能不会抱怨......在foo的构造函数中你正在设置类Wrapper的字段。publicvoidFoo(){Property.Member=42;//没有设置属性,你正在访问一个字段。}在第二个示例中,您正在设置属性publicvoidFoo(){//将属性“Property”设置为“Property”的值//您应该看到调用了getter和setter。财产=财产;我不知道你想做什么,但也许你希望Wrapper有一个属性。公共类包装器{私有int成员;publicintMember{get{返回数据;}设置{数据=值;然后当你做Property.Member=42时,setter会在Wrapper.Member上被调用通常人们通过Add()方法直接将对象添加到列表中,而这又不会触发setter。私有列表_namesList=newList();//名字列表publicListNamesList{get{return_namesList;}设置{如果(值==_namesList){返回;}_namesList=值;在上面的NamesList属性中,如果你调用NamesList.Add("test")它不会调用setter。简单的解决方案是将列表存储在一个新变量中并逐渐将该变量设置为NamesList,例如Listlst=newList{"test1"};d.NamesList=lst;//setter将触发。但是直接将对象添加到列表/集合中是一个常见的错误。?以上是C#学习教程:修改成员时不要调用C#对象setter。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: