You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 9.0中VB.NET的Friend WithEvents用户控件成员为何需代码序列化?

问题解答

1. Friend WithEvents 是不是特殊的虚拟属性?

是的,这是VB.NET的原生语言特性:当你用WithEvents修饰字段时,编译器会自动为这个字段生成一个隐式的虚拟属性,用来处理事件绑定的底层逻辑。这个隐式属性的可见性和原字段一致(这里是Friend),所以在.NET 9的WinForms序列化检查中,会被识别为需要配置序列化的属性——这就是为什么你明明写的是字段,却收到了属性相关的编译错误。

2. 这是不是编译器Bug?

不是Bug。.NET 9对WinForms设计器的序列化规则做了强化,要求所有对设计器可见的属性(包括VB.NET隐式生成的这类属性)必须显式声明序列化配置。之前的.NET版本没有这么严格的检查,所以升级后才会触发这个错误。

3. 除了移除WithEvents或修改可见性,还有其他解决方案吗?

有两种更灵活的方案:

  • 给字段添加序列化隐藏属性:直接在Friend WithEvents字段上添加<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)>和<EditorBrowsable(EditorBrowsableState.Never)>修饰,编译器会把这些属性传递给生成的隐式属性,让设计器跳过对它的序列化检查。代码示例:
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)>
    <EditorBrowsable(EditorBrowsableState.Never)>
    Friend WithEvents Item1 As New DisplayItem
    
    这个方案适合你不需要设计器序列化该控件的场景(毕竟你是手动创建的控件)。
  • 手动显式实现属性:把原字段改为Private WithEvents,然后自己定义一个Friend属性来包装它,同时给这个显式属性添加序列化配置。示例:
    Private WithEvents _item1 As New DisplayItem
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)>
    Friend Property Item1 As DisplayItem
        Get
            Return _item1
        End Get
        Set(value As DisplayItem)
            _item1 = value
        End Set
    End Property
    
    这种方式更灵活,但需要额外的代码量。

内容的提问来源于stack exchange,提问作者J Collins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 22:52:12