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
相关产品推荐
相关产品推荐

