当前位置: 首页 > news >正文

C#值类型属性的典型问题

问题复现:值类型属性的副本问题

以下代码展示了值类型属性的典型问题:

struct Point
{public int X;public int Y;
}class MyClass
{public Point Position {get; set;}
}// 使用属性修改结构体(无效!)
var obj = new MyClass();
obj.Position.X = 10; // 错误:修改的是副本,原始_point未变化

obj.Position.X = 10;

等价于

Point temp=obj.Position; //值类型的复制其实是建立一个副本,与原数据没有关联

temp.X=10,

解决方案:三种正确修改值类型属性的方法

方法 1:重新赋值整个结构体
var temp = obj.Position;
temp.X = 10;
obj.Position = temp; // 正确:通过setter更新原始结构体
方法 2:通过类(MyClass)的方法封装修改逻辑
class MyClass
{private Point _point;public Point Position{get => _point;set => _point = value;}// 提供修改方法public void SetPositionX(int x){_point.X = x; // 直接修改私有字段}
}// 使用
obj.SetPositionX(10); // 正确:直接修改原始结构体
方法 3:将结构体改为类(引用类型)
class Point // 改为类(引用类型)
{public int X;public int Y;
}class MyClass
{public Point Position {get; set;}
}// 使用(直接修改有效)
obj.Position.X = 10; // 正确:修改的是引用指向的对象

总结:属性与值类型的交互规则

场景行为解决方案
属性返回值类型(结构体)每次返回副本,直接修改无效通过方法封装或重新赋值整个结构体
属性返回引用类型(类)返回引用,修改直接生效无需特殊处理
字段是值类型直接访问原始数据,修改生效但违反封装原则,慎用
需要频繁修改状态的对象使用类而非结构体避免值类型复制开销和语义问题

http://www.lryc.cn/news/597015.html

相关文章:

  • 基于.Net Core开源的库存订单管理系统
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 主页-微博点赞量Top6实现
  • 粗大误差智能滤除:基于格拉布斯准则与机器学习的数据清洗体系​
  • 深入理解 TCP 协议:Linux 网络传输的可靠基石
  • 【Node.js】使用ts-node运行ts文件时报错: TypeError: Unknown file extension “.ts“ for ts 文件
  • Node.js 倒计时图片服务部署与 Nginx 反向代理实战总结
  • The History of Computers
  • 用 Phi-3 Mini 4K Instruct 实现轻量级模型量化与加载
  • WWDC 25 给自定义 SwiftUI 视图穿上“玻璃外衣”:最新 Liquid Glass 皮肤详解
  • 漫画机器学习播客对话图文版
  • OpenHarmony BUILD.gn中执行脚本
  • 趣玩-Ollama-Llm-Chatrbot
  • 第四章 Freertos物联网实战DHT11温湿度模块
  • 利用aruco标定板标定相机
  • EDoF-ToF: extended depth of field time-of-flight imaging解读, OE 2021
  • C Primer Plus 第6版 编程练习——第10章(上)
  • 2025暑期—05神经网络-BP网络
  • 深入解析预训练语言模型在文本生成中的革命性应用:技术全景与未来挑战
  • 工业微控制器的启动过程以及安全设计所面临的挑战
  • TODAY()-WEEKDAY(TODAY(),2)+1
  • 数据结构系列之二叉搜索树
  • 关于针对 DT_REG 出现红色波浪线的问题(编译错误/IDE警告),以下是 精准解决方案,保持你的代码功能完全不变:
  • LeetCode11~20题解
  • 动态递归之正则表达式
  • 西安电子科技大学金融学431考研经历分享
  • 分布式任务调度实战:XXL-JOB与Elastic-Job深度解析
  • 一次Oracle集群脑裂问题分析处理
  • PetaLinux 使用技巧与缓存配置
  • Oracle迁移到高斯,查询字段默认小写,解决办法
  • Zookeeper学习专栏(七):集群监控与管理