c#,字段和属性的区别

c#,string test和string test{ges;set;}有什么区别

在C#中,string test和string test { get; set; }表达了两种不同的成员声明,它们在类中的作用和访问方式是不同的。

string test:

这是一个字段(field)声明。它声明了一个类型为string的字段test。字段通常用来存储类的数据。字段可以是公共的、私有的或者其他访问修饰符指定的可见性。默认情况下,字段是私有的。例如:

public class MyClass
{string test; // 私有字段
}

字段是类的内部状态的一部分,通常是私有的,这意味着它们不能被类的外部直接访问,而是通过方法(如构造函数、公共方法等)来管理。

string test { get; set; }:

这是一个属性(property)声明。属性是字段的封装器,提供了一种安全的访问字段的方法,并允许在获取或设置字段值时加入逻辑。属性可以有一个get访问器和一个set访问器。在这个例子中,test属性有一个自动实现的get和set访问器,这意味着编译器会自动生成一个私有的后备字段,并在访问器中插入适当的代码来返回和设置这个字段的值。例如:

public class MyClass
{public string Test { get; set; } // 公共属性
}

属性通常用公共访问修饰符来声明,以便类的外部可以安全地访问类的内部状态,同时保持封装。你还可以在属性的get和set访问器中添加额外的逻辑,例如,验证数据或修改其他相关的字段值。

总结:

  • 字段通常是类的私有成员,直接存储数据。
  • 属性是公共接口的一部分,封装字段,并可能包含附加逻辑。它们使用访问器(get和set)来读取和修改值。

有什么好处? 使用的地方?

使用属性 (string test { get; set; }) 而非字段 (string test) 的好处主要在于封装(Encapsulation)、可读性和灵活性。

封装(Encapsulation)

封装是面向对象编程(OOP)的核心原则之一,它允许你隐藏实现细节并控制对象状态的访问。通过使用属性,你可以保护字段不被直接访问,这意味着你可以在不影响类的公共接口的情况下更改字段的内部实现。

可读性

属性使得你的类的用途和操作更清晰。通过阅读属性名称和它们的访问器,你可以了解你能对这些属性做什么,例如,是否只能读取它们(只有get),还是也能设置它们(有get和set)。

灵活性

使用属性允许你在设置和获取值时插入额外的逻辑,而不会暴露类的内部实现。例如,你可能想要在设置一个属性值时验证该值,或者在获取一个属性值时计算该值。

使用场景

  • 字段(Fields): 通常在类内部使用,作为私有成员,存储数据。

    • 作为私有存储机制,它们是实现细节的一部分。
    • 通常不希望外部代码直接访问和修改这些字段,以免破坏对象的状态。
  • 属性(Properties): 通常作为类的公共API的一部分,用于数据访问。

    • 提供了一种受控的方式来读取(get)和修改(set)值。
    • 可以实现数据验证和懒加载等逻辑。
    • 可以提供与字段不同的公共访问级别,例如,公共的get访问器和私有的set访问器。
    • 当类的某个状态或值需要被外部访问或修改时,属性是首选。

示例

想象你有一个Person类,它有一个Age字段。如果你直接将Age作为公共字段,任何外部代码都可以设置Age为一个无效值(比如一个负数)。这是使用字段可能造成的问题:

public class Person
{public int Age; // 不推荐这样做,因为没有封装
}

如果使用属性,你可以防止无效的操作,例如:

public class Person
{private int _age;public int Age{get { return _age; }set{if (value < 0)throw new ArgumentOutOfRangeException("Age cannot be negative.");_age = value;}}
}

在上面的示例中,任何尝试将Age设置为负数的操作都会引发异常,因此维护了Person对象的有效状态。这是封装在实际使用中的一个例子。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/135211.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Qt之QSequentialIterable】使用

介绍 QSequentialIterable类是一个容器在QVariant中的可遍历接口。该类允许多种方法来访问存储在QVariant中容器的元素。如果一个QVariant可以转换为QVariantList&#xff0c;那么可以从其中提取出QSequentialIterable的实例。 QList<int> intList {7, 11, 42};QVarian…

2023年11月在线IDE流行度最新排名

点击查看最新在线IDE流行度最新排名&#xff08;每月更新&#xff09; 2023年11月在线IDE流行度最新排名 TOP 在线IDE排名是通过分析在线ide名称在谷歌上被搜索的频率而创建的 在线IDE被搜索的次数越多&#xff0c;人们就会认为它越受欢迎。原始数据来自谷歌Trends 如果您相…

08.Diffusion Model数学原理分析(上)

文章目录 Diffusion Model回顾Diffusion Model算法TrainingInference 图像生成模型的本质目标MLE vs KLVAE计算 P θ ( x ) P_\theta(x) Pθ​(x)Lower bound of log ⁡ P ( x ) \log P(x) logP(x) DDPM计算 P θ ( x ) P_\theta(x) Pθ​(x)Lower bound of log ⁡ P ( x ) \…

数据结构与算法-(11)---有序表(OrderedList)

&#x1f308;个人主页: Aileen_0v0 &#x1f525;系列专栏:PYTHON学习系列专栏 &#x1f4ab;"没有罗马,那就自己创造罗马~" 目录 知识回顾及总结 有序表的引入 ​编辑 实现有序表 1.有序表-类的构造方法 2.有序表-search方法的实现 3.有序表-add方法的实现…

ArrayList和LinkedList的区别有哪些?

ArrayList 和 LinkedList 是 Java 中常用的两种集合类&#xff0c;它们之间有一些重要的区别&#xff0c;主要涉及到其内部实现和性能特点&#xff1a; 内部实现&#xff1a; ArrayList 是基于动态数组实现的。它使用一个数组来存储元素&#xff0c;当数组已满并需要添加新元素…

【技术类-01】doc转PDF程序卡死的解决方案,

摘要&#xff1a; 1、出现 raise AttributeError("%s.%s" % (self._username_, attr))&#xff09; 2、表现&#xff1a;doc转PDF卡死&#xff08;白条不动或出现以上英文&#xff09; 3、解决&#xff1a;在docx保存代码行后面加上time.sleep(3) 4、原因&#x…

SpringBoot系列之集成Redission入门与实践教程

Redisson是一款基于java开发的开源项目&#xff0c;提供了很多企业级实践&#xff0c;比如分布式锁、消息队列、异步执行等功能。本文基于Springboot2版本集成redisson-spring-boot-starter实现redisson的基本应用 软件环境&#xff1a; JDK 1.8 SpringBoot 2.2.1 Maven 3.2…

Leetcode刷题【hot100】两数之和

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回…

Java进阶篇--线程池之FutureTask

目录 FutureTask简介 FutureTask的基本使用 FutureTask的应用场景 FutureTask简介 FutureTask是Java中的一个类&#xff0c;用于表示可获取结果的异步任务。它实现了java.util.concurrent.Future接口&#xff0c;提供了启动和取消异步任务、查询任务是否已完成以及获取最终…

虚拟机 smbus host controller not enabled

虚拟机空间不足 -> 扩展磁盘容量 -> 系统自动安装或启用了i2c_piix4模块 按住shift重新启动

腾讯云3年云服务器价格及购买教程

腾讯云作为国内领先的云计算服务提供商&#xff0c;提供了多种优惠的云服务器套餐&#xff0c;以满足不同用户的需求&#xff0c;本文将详细介绍腾讯云3年云服务器价格及购买教程&#xff0c;新老用户均可购买&#xff01; 1、活动页面&#xff1a;传送门>>> 2、进入…

P3379 【模板】最近公共祖先(LCA)

洛谷里面8页题解千篇一律&#xff0c;就没有用线段树求解的&#xff0c;这下不得不由本蒟蒻来生啃又臭又硬&#xff0c;代码又多的线段树了。 样例的欧拉序列&#xff1a;4 2 4 1 3 1 5 1 4 记录每个节点最早在欧拉序列中的时间&#xff0c;任意两个节点的LCA就是他们两个节点…

8.基于SpringBoot3+Security6+JWT实现鉴权机制(二)

本文我们将实践前后端访问Token鉴权,后端校验Token的完整代码 1. build.gradle新增依赖包 implementation org.springframework.boot:spring-boot-starter-security2. 匿名用户无权访问控制 @Slf4j @Component public class AnonymousAuthenticationEntryPoint implements …

Kamailio $ru vs $du

本人就是这么理解的&#xff1a; $ru - requst url&#xff0c;sip请求的第一行里面的地址 $du - destination url&#xff0c;一般用来ip寻址 $ru可读可写&#xff0c;可读就没什么好讨论的&#xff0c;如果修改了$ru会发生什么 下面举例说明&#xff1a; request_route …

Flink -- 状态与容错

1、Stateful Operations 有状态算子&#xff1a; 有状态计算&#xff0c;使用到前面的数据&#xff0c;常见的有状态的算子&#xff1a;例如sum、reduce&#xff0c;因为它们在计算的时候都是用到了前面的计算的结果 总结来说&#xff0c;有状态计算并不是独立存在的&#xf…

ssh免密登录

单机 1 生成密钥 执行 ssh-keygen -t rsa &#xff08; 其中 rsa 是非对称算法&#xff09; 一路回车到底&#xff0c;生成密钥 且生成之后会在用户的根目录生成一个 “.ssh”的文件夹 2 添加公钥到 将 公钥内容追加到 authorized_keys 中&#xff1a; cat ~/.ssh/id_rsa.pub …

汽车网络安全渗透测试概述

目录 1.汽车网络安全法规概述 1.1 国外标准 1.2 国内标准 2.汽车网络安全威胁分析 2.1 汽车网络安全资产定义 2.2 汽车网络安全影响场景及评级示例 3.汽车网络安全渗透测试描述 3.1 参考法规 3.2 渗透测试内容 4.小结 1.汽车网络安全法规概述 近年来&#xff0c;汽车…

父组件中通过v-model来显示子组件

方法一 父组件示例&#xff1a; <operationRecord v-model"displayRecord" ></operationRecord> 子组件示例&#xff1a; <template><div><Modal v-model"opreate" width"1100" footer-hide on-cancel"labe…

科技创意赋能乡村文旅振兴

近日&#xff0c;由北京大学创意产业研究中心联合中国国际科技促进会新基建专委会共同主办的“科技创意赋能乡村振兴研讨会”在京举行&#xff0c;与会专家学者围绕“和美乡村共同富裕智慧文旅”主题进行深入探讨。北京大学创意产业研究中心副主任吕艺、国家文化和旅游公共服务…

利用改进的YOLOv5模型对玉米和杂草进行精准检测和精准喷洒

Accurate Detection and Precision Spraying of Corn and Weeds Using the Improved YOLOv5 Model 摘要1、引言 摘要 本文提出了一种基于改进yolov5s的轻量化模型&#xff0c;并构建了一种精密喷涂机器人。 首先&#xff0c;采用基于品类平衡和农艺特征的数据增广方法解决了数…