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

C#中使用is声明模式做类型测试是否会打断与原对象的引用关系?

问题解答

核心结论

不会打断引用关系,对contentModel或contentModelV1的对象成员修改会同步作用到原始传入的model对象上,原因如下:

  • C#中所有class定义的类型都是引用类型,引用类型的变量存储的是堆中对象的内存地址,变量赋值操作只会复制地址,不会复制对象本身。
  • 你代码中的is类型模式匹配语法if (model is ContentModel contentModel),只是声明了一个新的局部引用变量contentModel,指向和model完全相同的堆对象,没有创建新对象,也没有切断原有关联。
  • 后续contentModelV1 = contentModel的赋值同样是地址复制,最终model、contentModel、contentModelV1三个变量都指向同一个原始对象。

注意边界

只有你对局部变量本身做重新赋值时,才会改变该变量的指向,比如执行contentModel = new ContentModel(),此时contentModel会指向新创建的对象,不再关联原始对象,但这种操作不会修改原始对象,也不会改变model、contentModelV1的指向。

你给出的代码格式化后如下:

private void SetTagsInChildren(List<string> tags, Model model)
{
    ContentModel contentModelV1;

    if (model is ContentModel contentModel)
         contentModelV1 = contentModel;

    // Logic to set new tags in model
}

补充说明:如果你的Model/ContentModel是struct定义的值类型,赋值会复制整个对象,修改不会同步,但常规业务开发中的模型类基本都是引用类型的class,因此你这个场景下的修改会完全同步到原始传入对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:45:05