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

C#属性访问器Set与Get详解

属性 Set 和 Get 访问器总结

一、核心概念对比

概念定义作用访问权限示例
字段private string name;存储数据通常私有private int age;
属性public string Name { get; set; }访问数据通常公有public int Age { get; set; }

二、属性的三种写法

1.完整写法(原始写法)

csharp

private string _name; // 私有字段 public string Name // 公有属性 { get { return _name; // 返回字段值 } set { _name = value; // 设置字段值 } }

2.简化写法

csharp

// 如果只是简单传递值,可以简化 private int _id; public int Id { get { return _id; } set { _id = value; } }

3.自动属性(语法糖)

csharp

// 编译器自动生成私有字段 public bool Sex { get; set; } public int Age { get; set; }

三、Set 和 Get 访问器的本质

Set 访问器

csharp

// 本质:一个设置值的方法 public string Name { set // 相当于:public void SetName(string value) { _name = value; // value 是用户传入的值 } } // 使用:p.Name = "张三"; // 相当于:p.SetName("张三");

Get 访问器

csharp

// 本质:一个获取值的方法 public string Name { get // 相当于:public string GetName() { return _name; } } // 使用:string name = p.Name; // 相当于:string name = p.GetName();

四、访问器的实际应用(重要)

1.添加验证逻辑

csharp

private int _age; public int Age { get { return _age; } set { if (value < 0 || value > 200) throw new Exception("年龄必须在0-200之间");//做一个限定值 不在值内报异常 _age = value; } }

2.添加额外逻辑

csharp

private string _name; public string Name { get { Console.WriteLine("获取Name值"); return _name + " 视觉67班"; // 返回时添加额外信息 } set { Console.WriteLine($"设置Name值: {value}"); _name = value; } }

3.只读或只写属性

csharp

// 只读属性(只有get) public string Id { get; } = Guid.NewGuid().ToString(); // 私有set public string Name { get; private set; } // 只写属性(不常见) private string _secret; public string Secret { set { _secret = value; } }

六、为什么要用属性而不是字段

1.数据封装

csharp

// ❌ 不好:直接暴露字段 public int Age; // 外部可以直接设置为负值 // ✅ 好:通过属性控制 private int _age; public int Age { get { return _age; } set { if (value >= 0 && value <= 150) _age = value; } }

2.向后兼容

csharp

// 第一版:直接使用字段 public int Score; // 第二版:改为属性,添加验证 private int _score; public int Score { get { return _score; } set { if (value >= 0 && value <= 100) _score = value; } } // 外部代码无需修改,仍然使用 obj.Score

3.数据绑定支持

csharp

// WPF、WinForms 等 UI 框架支持属性绑定 public string UserName { get; set; } // 可以绑定到 TextBox

八、常见错误

❌ 错误1:无限递归

csharp

public string Name { get { return Name; } // ❌ 递归调用自身 set { Name = value; } // ❌ 递归调用自身 } // ✅ 正确:引用字段 public string Name { get { return _name; } // ✅ set { _name = value; } // ✅ }

❌ 错误2:忘记字段

csharp

public int Score { get { return ???; } // ❌ 没有字段可返回 set { ??? = value; } // ❌ 没有字段可赋值 } // ✅ 正确:先定义字段 private int _score; public int Score { get { return _score; } set { _score = value; } }

九、一句话总结

字段存储数据要私有,属性访问数据要公有。Set 是设置值的方法,Get 是获取值的方法。需要验证用完整属性,简单情况用自动属性。

http://www.jsqmd.com/news/101753/

相关文章:

  • python pandas操作excel
  • BONT-L肽有效成分:棕榈酰六肽-19 Palmitoyl Hexapeptide-19
  • LobeChat ISO27001体系建设建议
  • 6‘-唾液乳糖— 引领婴幼儿营养与健康的下一代母乳低聚糖核心成分 CAS:35890-39-2
  • K8S总结与展望:Service Mesh、Serverless 及 K8S 发展趋势
  • 机器学习--线性回归
  • 唾液基乳糖-N-四糖 A 铵盐— 赋能下一代营养与疗法的关键母乳寡糖 CAS:64003-53-8
  • 网络爬虫相关操作--selenium库(超详细版)
  • 别再问了!0基础转行网络安全完全可行,这份终极发展路线请收好
  • Pinterest灵感采集:LobeChat发现流行美学
  • 麒麟系统运行LobeChat是否流畅?实测告诉你答案
  • 二唾液酸乳糖—赋能婴幼儿营养与免疫调节的明星母乳寡糖 CAS号: 18409-15-9
  • 半年成功入行网络安全!一位零基础转行者的真实学习路径与资源全分享
  • 如何将VSCode的扩展同步到另一台电脑
  • 别被“人才紧缺”迷惑!零基础小白入行网络安全的真实路径与避坑指南
  • 13、深入探索 GNOME 桌面环境的实用技巧与应用
  • LobeChat留学申请文书辅助撰写
  • 别再纠结!2025高薪IT赛道二选一:云计算运维与网络安全的真实转行故事与选择建议
  • 分享夸克网盘解析不限速下载的工具网站
  • 480万人才缺口下的机遇:零基础如何靠“实战力”闯入网络安全?
  • 第三次个人博客作业
  • 1、Linux网络管理与资源指南
  • 物联网边缘设备+LobeChat分布式AI终端网络
  • 14、Red Hat Linux实用应用指南
  • 2025零基础通关网络安全:一篇涵盖从入门到精通的保姆级指南
  • 0基础转行网络安全,到底行不行?附全网最全人才发展路线图
  • 零基础转行网络安全:一份2025年最新学习路线图与入门指南
  • 数字员工赋能熊猫智汇推动AI销售工具智能化转型
  • 15、Red Hat Linux实用指南:设备连接、软件应用与多媒体体验
  • 耐达讯自动化网关:用Profinet唤醒沉睡的DeviceNet流量计,省下60%改造费!