C#的属性讲解

文章目录

  • 属性
  • 自动实现属性
  • 访问器内写逻辑
  • 属性不存储值
  • 其他文章

属性

在C#中,属性是一种特殊的成员,用于封装类的字段。它们提供了一种简洁和安全的方式来访问和设置类的状态和行为。

属性由两个访问器组成:get(获取器)和set(设置器)。get访问器用于获取属性的值,set访问器用于设置属性的值。可以自定义属性的这两个访问器,使其满足特定的逻辑和要求。

属性的语法格式如下:

[修饰符] 数据类型 属性名 { get; set; }

其中,修饰符可以是public、private、internal等访问修饰符,代表属性的可访问性。

接下来我们尝试定义一个属性。

public class Person
{private string name;public string Name{get { return name; }set { name = value; }}
}

在上述示例中,我们定义了一个Person类,并在该类中定义了一个名为Name的属性。属性的类型为string。

在属性的定义中,我们使用了get和set访问器。get访问器返回属性的值,而set访问器接受一个值作为参数,并将其赋给属性。

使用属性时,我们可以像使用字段一样访问和设置属性的值,但实际上是调用了对应的访问器。例如:

Person p =new Person();
p.Name = "Alice"; // 设置属性的值
Console.WriteLine(p.Name); // 获取属性的值

运行结果如下:
在这里插入图片描述
通过定义get和set访问器,属性提供了更好的封装性和安全性。我们可以在访问器中添加额外逻辑,如输入验证、计算等。此外,属性还可以与自动实现属性相结合,以进一步简化属性的定义。

除了普通属性外,C#还提供了只读属性(只有get访问器)和写入器属性(只有set访问器),以及静态属性和索引器属性等类型的属性,以满足更多复杂的需求。

自动实现属性

当我们定义属性时,我们可以使用自动实现属性来简化代码,特别是对于只提供基本的 get和 set的属性。

自动实现属性允许我们在不显式定义私有字段的情况下声明属性。编译器会自动生成一个隐藏的私有字段来存储属性的值。这样,我们可以通过属性访问和设置字段的值,而不需要手动编写和管理字段。

下面我们实现一下自动实现属性,体验一下。

public class Person
{public string Name { get; set; }public int Age { get; set; }
}

在上述示例中,我们定义了一个 Person 类,并使用自动实现属性定义了 Name 和 Age 属性。编译器会自动生成隐藏的私有字段来存储这些属性的值。

使用自动实现属性时,我们可以像访问字段一样访问和设置属性的值。

继续使用之前的函数调用,我们来运行一下程序,运行结果如下图所示。
在这里插入图片描述
实际上,编译器会自动为属性生成对应的 get 和 set 访问器,使其访问和设置隐藏的私有字段。

访问器内写逻辑

除了自动实现属性,我们还可以在属性的访问器中添加自定义逻辑。例如,我们可以在设置器中验证输入值的有效性,并在获取器中返回计算的属性值。

编写一个Circle类,代码如下所示。

public class Circle
{private double radius;public double Radius{get { return radius; }set{if (value > 0)radius = value;elsethrow new ArgumentException("半径必须大于零");}}public double Area{get { return Math.PI * Math.Pow(radius, 2); }}
}

在上面的代码中,我们定义了一个 Circle 类,其中包含 Radius 和 Area 两个属性。在 Radius 属性的设置器中,我们添加了一个输入验证,确保半径的值大于零。在 Area 属性的获取器中,我们根据半径的值计算并返回圆的面积。

然后我们编写一下函数调用,测试是否正常:

        Circle myCircle = new Circle();myCircle.Radius = 5.0; // 设置半径属性的值Console.WriteLine($"半径: {myCircle.Radius}");Console.WriteLine($"面积: {myCircle.Area}");

运行结果如下所示。
在这里插入图片描述

属性不存储值

需要注意的是,当我们定义属性时,它们实际上并不存储值。属性只是封装了对类的字段的访问和修改,它们提供了一种更高级的方式来读取和写入字段的值。

其他文章

C#如何获取当前主机的局域网IP
C#实现局域网之间互相传递消息

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

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

相关文章

【Java核心】JDK、JRE、 JVM的联系与区别

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ JDK、JRE、 JVM的联系与区别 1. 简述2. 是什么…

分类预测 | Matlab实现NGO-CNN-SVM北方苍鹰算法优化卷积支持向量机分类预测

分类预测 | Matlab实现NGO-CNN-SVM北方苍鹰算法优化卷积支持向量机分类预测 目录 分类预测 | Matlab实现NGO-CNN-SVM北方苍鹰算法优化卷积支持向量机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现NGO-CNN-SVM北方苍鹰算法优化卷积支持向量机分类预…

MySQL查询(基础到高级)

目录 一、单表查询: 1.基本查询: 1.1 查询多个字段: 1.2 去除重复记录: 2. 条件查询: 2.1 语法 2.2 条件分类: 比较运算符: between..and..使用示例: ​编辑 in(..) 使用示例&…

webpack:详解代码分离以及插件SplitChunksPlugin的使用

文章目录 背景入口起点分离基本使用防重复 SplitChunksPlugin插件分离背景基本使用splitChunks.chunkssplitChunks.minChunkssplitChunks.minSizesplitChunks.maxSizesplitChunks.namesplitChunks.cacheGroupssplitChunks.cacheGroups.{cacheGroup}.prioritysplitChunks.cacheG…

【力扣每日一题】2023.9.24 LRU缓存

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 这又是一道程序设计类的题目,要我们实现LRU缓存的get和put操作。 简单说一下LRU缓存是什么,在我看来就是实用主义…

Nginx环境搭建、负载均衡测试

Nginx环境搭建、负载均衡测试 系统环境: win10,IDEA2020,JDK8 一、nginx环境搭建 1.ngxin下载 Nginx官网下载: http://nginx.org/en/download.html Nginx有三种版本,分别是Mainline version(开发版&…

智慧公厕,公共厕所数字化促进智慧城市管理的成效

随着科技的不断进步和城市化的快速发展,城市管理也面临着新的挑战和机遇。而智慧公厕作为基层配套设施,通过数字化提升城市管理的效能,成为了现代智慧城市建设的重要一环。本文以智慧公厕领先厂家广州中期科技有限公司,大量项目案…

安装Linux虚拟机——以ubuntukylin-16.04.7-desktop-amd64.iso为例

正文 安装VMware 重要提示 安装软件之前,请先退出360、电脑管家等安全类软件,这类软件会阻止我们安装的软件进行注册表注册,很可能导致安装失败。确认物理机(也就是你自己使用的电脑)的防火墙已经关闭。 下载 打开…

深入学习 Redis - 分布式锁底层实现原理,以及实际应用

目录 一、Redis 分布式锁 1.1、什么是分布式锁 1.2、分布式锁的基础实现 1.2.1、引入场景 1.2.2、基础实现思想 1.2.3、引入 setnx 1.3、引入过期时间 1.4、引入校验 id 1.5、引入 lua 脚本 1.5.1、引入 lua 脚本的原因 1.5.2、lua 脚本介绍 1.6、过期时间续约问题&…

Linux系统上使用SQLite

1. 安装SQLite 在Linux上安装SQLite非常简单。可以使用包管理器(如apt、yum)直接从官方软件源安装SQLite。例如,在Ubuntu上使用以下命令安装SQLite: sudo apt-get install sqlite32. 打开或创建数据库 要打开或创建一个SQLite数…

2023华为杯数学建模D题第三问-碳排放路径优化(能源消费结构调整的多目标优化模型构建详细过程+模型假设(可复制))

1.碳排放约束下(人为干预按时碳达峰与碳中和的基准情景)能源消费结构多目标优化模型构建 1.1基本假设 本文的模型设计主要基于以下几个基本假设: (1)能源消费结构调整的根本驱动要素,是对投资耗费的最小化…

基于JAVA+SpringBoot+Vue+协同过滤算法+爬虫的前后端分离的租房系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 随着城市化进程的加快…

代码随想录|647. 回文子串,516.最长回文子序列

647. 回文子串 1.dp含义 dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是,则dp[i][j]为true,否则为false。 2.dp递推公式 整体上是两种,就是s[i]与s[j]相等,s[i]与…

AI AIgents时代 - (四.) HuggingGPT MetaGPT

🟢 HuggingGPT HuggingGPT是一个多模型调用的 Agent 框架,利用 ChatGPT 作为任务规划器,根据每个模型的描述来选择 HuggingFace 平台上可用的模型,最后根据模型的执行结果生成总结性的响应。 这个项目目前已在 Github 上开源&am…

Mybatis学习笔记7 参数处理专题

Mybatis学习笔记6 使用时的一些小技巧_biubiubiu0706的博客-CSDN博客 1.单个简单类型参数 2.Map参数 3.实体类参数 4.多参数 5.Param注解(命名参数) 6.Param源码分析 建表 插入点数据 新建模块 pom.xml <?xml version"1.0" encoding"UTF-8"?&…

数据结构(java)--队列1

一、我们还是依旧引入一个小例子&#xff08;银行排队&#xff09;&#xff1a; 需要取号排队&#xff0c;服务完下一个 二、队列介绍 1&#xff09;队列是一个有序列表&#xff0c;可以用数组或是链表来实现 2&#xff09;遵循先入先出的原则。即&#xff1a;先存入队列的数…

肖sir__项目实战讲解__004

项目实战讲解 一、项目的类型 金融类&#xff1a; 保险(健康险理财险)、证券、基金(股票型基金、混合型基金、指数型基金、债券型基金、 天天基金网&#xff08;ETF基金、货币型基金、量化基金)、银行、贷款、信用卡、外汇、二元期权、期货原油、blockchain、 数字货币、黄金白…

机器学习之正则化与验证提高模型泛化

文章目录 正则化&#xff08;Regularization&#xff09;&#xff1a;验证&#xff08;Validation&#xff09;&#xff1a; 正则化和验证是机器学习中重要的概念&#xff0c;它们帮助提高模型的性能和泛化能力。让我详细介绍一下这两个概念&#xff1a; 正则化&#xff08;Re…

三维重建_纹理重建与表面细化

目录 前言&#xff1a;为什么要重建纹理&#xff1f; 1. 纹理图像的自动创建 1.1 基础知识 1.2 算法流程 1.2.1 视角选择 1.2.2 纹理坐标的计算 1.2.3 全局颜色调整 1.2.4 泊松图像编辑 1.2.5 OBJ文件 1.3 结果示例 2. 网格细化优化 2.1 基础知识与数学模型 2.2 优…

TLS/SSL(十) session缓存、ticket 票据、TLS 1.3的0-RTT

一 TLS优化手段 TLS 为了提升握手速度而提出优化手段,主要是减少TLS握手中RTT消耗的时间关于session cache和session ticket,nginx关于ssl握手的地方都有影子 [指令] https面经 ① session 缓存 resume: 重用,复用 案例&#xff1a; 第二次访问www.baidu.com 说明&#x…