You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Blazor参数是否存在额外开销?应传递完整对象还是重构数据?

关于Blazor组件参数:传原始对象还是重构数据结构?

嘿,这个问题在Blazor开发里挺常见的,我给你拆解下核心的权衡点和决策逻辑:

  • 先搞懂Blazor参数的传递本质
    如果你的原始对象是引用类型(比如自定义的class),Blazor里参数传递默认就是引用传递,开销真的极低——说白了就是传个内存地址,根本不会复制整个对象。这种情况下,哪怕你的组件只用到原始对象里的部分属性,直接传整个引用完全没问题,没必要画蛇添足去重构新的数据结构,反而平白增加维护成本。

    举个实际的例子:假设你有个User类,里面有ID、姓名、邮箱还有一堆其他属性,但你的组件只需要显示姓名和ID,直接传User对象就行:

    public class User {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Email { get; set; }
        // 更多属性...
    }
    
    // 组件参数直接用User
    [Parameter] public User CurrentUser { get; set; }
    

    完全没必要特意去建个UserSummary类再传,除非有特殊需求。

  • 什么时候该考虑重构数据结构?
    只有当你遇到下面这些场景时,重构精简的数据结构才更划算:

    • 你需要传递值类型的副本(比如struct),这时候传完整原始对象的开销会比较大;
    • 原始对象非常庞大,且你担心组件会意外修改原始对象的其他属性(虽然Blazor推荐参数单向流动,但难免有手滑的时候);
    • 这个精简的数据需要跨多个不同组件复用,而且是通用型的(比如一个只需要ID和名称的卡片组件,适配用户、商品、分类等多种对象)。

    比如你的原始对象是包含上百个属性的Product,而你的组件只需要商品ID和价格,同时还要把这套数据传给好几个子组件,怕子组件误改商品的其他属性,这时候建个ProductPriceInfo小结构就很合适:

    public class ProductPriceInfo {
        public int ProductId { get; set; }
        public decimal Price { get; set; }
    }
    
  • 最后再给个决策优先级
    我的建议是:优先直接传递原始引用类型对象,除非你有明确的、必须重构的理由(比如刚才说的传副本、避免误改、通用复用),不然额外维护一套数据结构只会增加你的工作量。

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

火山引擎 最新活动