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

C# 字段和属性

在 C# 中,字段和属性是定义类和结构体数据的两种方式。

字段用于直接存储数据,而属性提供了对字段的封装和访问控制

1. 字段(Fields)

定义

字段是类或结构体中用于存储数据的变量。字段可以是任何数据类型,包括基本数据类型、类类型、数组等。字段通常具有访问修饰符,用于控制其可见性。

特点

  • 直接存储数据:字段直接存储数据。
  • 可见性:字段的访问修饰符(如 privatepublicprotected 等)决定了它们的可见性。
  • 不提供封装:字段通常不提供封装,因此可能会直接被访问和修改。
public class Person
{// 字段private string name;private int age;public Person(string name, int age){this.name = name;this.age = age;}
}

name 和 age 是 Person 类的字段

2. 属性(Properties)

定义

属性是类或结构体的成员,提供了一种控制对字段访问的方式。属性由 get 和 set 访问器组成,用于读取和写入字段的值。通过属性,可以在访问数据时添加逻辑,例如验证数据或触发事件。

特点

  • 封装:属性提供了对字段的封装,允许在读取和写入数据时执行额外逻辑。
  • 访问控制:可以分别定义 get 和 set 访问器的访问修饰符,以控制对属性的读取和写入权限。
  • 易于维护:使用属性可以使类的内部实现更易于维护和修改,而不影响使用该类的外部代码。
public class Person
{//字段private string name;private int age;// 属性public string Name{get { return name; }set { name = value; } // 可以添加验证逻辑}public int Age{get { return age; }set{if (value < 0) // 验证年龄不能为负数throw new ArgumentException("Age cannot be negative.");age = value;}}public Person(string name, int age){Name = name; // 使用属性赋值Age = age;   // 使用属性赋值}
}

Name 和 Age 是 Person 类的属性,通过属性可以控制对字段的访问,并在设置年龄时添加了验证逻辑。 

3.字段与属性的比较

特性字段(Fields)属性(Properties)
直接存储数据否(通过访问器间接存储数据)
访问控制通过访问修饰符可以分别控制 get 和 set 的访问权限
封装不提供封装提供封装,可以添加逻辑
可维护性
语法直接定义变量使用 get 和 set 关键字

4. 自动属性 

 C# 还支持自动属性(Auto-Implemented Properties),在不显式定义字段的情况下创建属性。

编译器会自动为你生成一个私有的匿名字段

C# 自动属性-CSDN博客

建议:使用属性而非字段来暴露数据(即字段用private或protected),用来保护字段不被外部非法污染。

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

相关文章:

  • 【leetcode】N皇后 回溯法c++
  • Ubuntu 系统端口查询与管理详细分析
  • Unity中使用StartCoroutine协程和Lerp方法,使GameObject缓慢移动
  • C++根据特定字符截取字符串
  • 【How AI Works】读书笔记3 出发吧! AI纵览 第二部分
  • No Module named pytorchvideo.losses问题解决
  • Mac终端字体高亮、提示插件
  • Flowable 构建后端服务(后端以及数据库搭建) Flowable Modeler 设计器搭建(前端)
  • [Java]微服务拆分
  • JavaScript逆向爬虫教程-------基础篇之JavaScript混淆原理
  • qt移植到讯为rk3568,包含一些错误总结
  • 使用阿里云快速搭建 DataLight 平台
  • ubuntu设置自启动
  • Paddle分布式训练报NCCL错
  • PD3.1快充对我们到底有没有必要?
  • Android OpenGL ES详解——立方体贴图
  • Bugku CTF_Web——字符?正则?
  • C# 中Math.Round 和 SQL Server中decimal(18,2) 不想等的问题
  • lab2:docker基础实战
  • Druid 1.2 源码导读
  • 千益畅行,共享旅游卡市场乱象解析与未来展望
  • Dubbo源码解析-服务导出(四)
  • 浅谈React的虚拟DOM
  • linux上海康SDK安装并设置环境变量
  • 【计算机网络】UDP网络程序
  • 什么是全域电商?有哪些电商代运营公司能做全域电商代运营?
  • 微信小程序上传pdf和显示
  • MongoDB分布式集群搭建----副本集----PSS/PSA
  • PDF编辑的好东西
  • 块设备的两种访问方法的区别