C# 字段(Field)与属性(Property)的区别

devtools/2024/10/21 13:34:51/
  • 字段和属性,都是成员变量,都用于存取数据。
  • 字段读写无限制,属性通过get和set方法可以控制读写(比如可以在年龄Age属性的set方法中限制,当赋值的value大于200时,则赋值默认值100,从而确保数据准确性)。
  • 按照类的设计原则,字段一般用在类的内部使用(private),属性一般供外部类访问(public)。

 示例类

public class TestClass
{//私有字段private string privateField;//公有字段(实际开发时,存在公有的字段)public string publicField;//静态字段public static string staticField;//私有属性private string privateProp { get; set; }//公有属性public string publicProp { get; set; }//静态属性public static string staticProp { get; set; }//重写ToString方法public override string ToString(){return $"privateField:{privateField},publicField:{publicField},staticField:{staticField},privateProp:{privateProp},publicProp:{publicProp},staticProp:{staticProp}";}
}

使用System.Reflection反射验证

public string GetName()
{string infoStr = string.Join(",", typeof(TestClass).GetFields().Select(s => s.Name));string propStr = string.Join(",", typeof(TestClass).GetProperties().Select(s => s.Name));return $"{infoStr}  ||  {propStr}";
}
// 等价于
public string GetName()
{//BindingFlags绑定Public(公有)、Instance(实例)、Static(静态)string infoStr = string.Join(",", typeof(TestClass).GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static).Select(s => s.Name));string propStr = string.Join(",", typeof(TestClass).GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static).Select(s => s.Name));return $"{infoStr}  ||  {propStr}";
}

结果为:publicField,staticField || publicProp,staticProp

使用System.Reflection的GetFields获取类的字段信息,使用GetProperties获取类的属性信息,默认获取Public(公有)、Instance(实例)、Static(静态)的变量

加上BindingFlags.NonPublic条件获取会得到以下结果

string infoStr = string.Join(",", typeof(TestClass).GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static).Select(s => s.Name));
string propStr = string.Join(",", typeof(TestClass).GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static).Select(s => s.Name));

infoStr为:privateField,publicField,<privateProp>k__BackingField,<publicProp>k__BackingField,staticField,<staticProp>k__BackingField

propStr为:privateProp,publicProp,staticProp

propStr的值是预期之内的,多加了BindingFlags.NonPublic条件,就多获取到私有的privateProp属性。

infoStr的值却意料之外,除了多了privateField私有字段,还多了几个名字带有属性名的k__BackingField字段。

在C#中,k__BackingField是一个常见的编译器生成的字段名称,它用于实现属性的自动属性(auto-implemented properties)。

在C#中,自动属性允许你声明一个属性而不显式定义后备字段。编译器会自动为你创建一个私有的后备字段,并为你提供getter和setter的默认实现。这个自动创建的后备字段的名称通常以k__BackingField结尾。

例如,考虑以下代码:

public class MyClass
{public int MyProperty { get; set; }
}

编译器实际上会为你生成如下的代码:

public class MyClass
{private int <MyProperty>k__BackingField;public int MyProperty{get{return <MyProperty>k__BackingField;}set{<MyProperty>k__BackingField = value;}}
}

注意,<MyProperty>k__BackingField是编译器生成的字段名称。在实际代码中,你不应该直接访问这个字段,因为它是一个实现细节,可能会在不同的编译器版本或不同的编译器设置下发生变化。


http://www.ppmy.cn/devtools/31024.html

相关文章

【数学 排列组合】1643. 第 K 条最小指令

本文涉及知识点 数学 排列组合 LeetCode1643. 第 K 条最小指令 Bob 站在单元格 (0, 0) &#xff0c;想要前往目的地 destination &#xff1a;(row, column) 。他只能向 右 或向 下 走。你可以为 Bob 提供导航 指令 来帮助他到达目的地 destination 。 指令 用字符串表示&am…

LeetCode 102.对称二叉树

题目描述 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false提示&#xff1a; 树中节点数…

基于缓存注解的时间戳令牌防重复提交设计

文章目录 一&#xff0c;概述二&#xff0c;实现过程1、引入pom依赖2、定义缓存管理3、时间戳服务类4、模拟测试接口 三&#xff0c;测试过程1&#xff0c; 模拟批量获取2&#xff0c; 消费令牌 四&#xff0c;源码放送五&#xff0c;优化方向 一&#xff0c;概述 API接口由于…

数据结构和算法

目录 数据结构 算法 数据结构是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的集合。这种“结构”可以理解为数据元素之间的逻辑关系&#xff0c;包括数据的逻辑结构和物理结构。精心选择的数据结构往往可以带来更高的运行或者存储效率…

Ftrans文件外发系统 构建安全可控文件外发流程

文件外发系统是企业数据安全管理中的关键组成部分&#xff0c;它主要用于处理企业内部文件向外部传输的流程&#xff0c;确保数据在合法、安全、可控的前提下进行外发。 文件外发系统的主要作用包括&#xff1a; 1、防止数据泄露&#xff1a;通过严格的审批流程和安全策略&…

[XYCTF新生赛]-PWN:fmt解析(scanf格式化字符串漏洞,任意地址写)

查看保护 查看ida 这里没什么好说的 完整exp&#xff1a; from pwn import* context(log_leveldebug) #pprocess(./fmt) premote(gz.imxbt.cn,20975) backdoor0x4012BEp.recvuntil(bgift: ) printf_addrint(p.recv(14),16) print(hex(printf_addr)) libcELF(./libc-2.31.so) …

SQL LPAD函数使用

Oracle SQL 中的 LPAD 函数是一个用于格式化字符串的函数&#xff0c;它会在给定字符串的左侧填充指定的字符&#xff0c;直到字符串达到指定的长度。这个函数在数据库查询中非常有用&#xff0c;尤其是在需要对输出进行格式化时&#xff0c;比如在报表中。 LPAD 函数的语法 …

el-collapse:如何监听折叠后事件

项目场景&#xff1a; 项目需要在折叠组件收起后动态计算下方组件内容高度后赋值&#xff0c;这个时候就需要获取折叠后事件 代码描述 <el-collapse v-model"activeNames" change"handleChange" ref"myCollapseRef"> </el-collapse &…