C#的属性讲解

news2025/2/25 17:03:02

文章目录

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

属性

在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;
            else
                throw 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.coloradmin.cn/o/1037330.html

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

相关文章

测试工程师需要具备哪些“技能”?

1、良好的沟通 相信大家都在网上看到过各种吐槽程序员不解风情的段子,开怀大笑之余深思,作为一个测试工程师又何尝不是如此?通常沟通技能成为横亘在测试工程师与其他合作部门之间的万丈鸿沟,也成为测试工程师成长的最大瓶颈。下面…

【软件设计师-从小白到大牛】上午题基础篇:第三章 数据库系统

文章目录 前言章节提要一、三级模式两级映射真题链接 二、数据库的设计过程真题链接 三、E-R模型真题链接 四、关系代数SQL基础(补充) 五、规范化理论1、函数依赖2、价值与用途3、键4、范式5、模式分解 六、并发控制真题链接分布式数据库特点&#xff08…

二值贝叶斯滤波计算4d毫米波聚类目标动静属性

机器人学中有些问题是二值问题,对于这种二值问题的概率评估问题可以用二值贝叶斯滤波器binary Bayes filter来解决的。比如机器人前方有一个门,机器人想判断这个门是开是关。这个二值状态是固定的,并不会随着测量数据变量的改变而改变。就像门…

关于计算机找不到d3dx9_43.dll,无法继续执行代码修复方法

d3dx9_43.dll是一个动态链接库文件,它是DirectX的一个组件,主要用于处理游戏中的图形、声音等多媒体元素。当这个文件丢失时,可能会导致以下问题: 1. 游戏无法正常运行:由于d3dx9_43.dll负责处理游戏中的多媒体元素&a…

Qt地铁智慧换乘系统浅学( 一 )存储站点,线路信息

存储 定义所需要的容器定义最大最小经纬度[统计站点信息 在经纬度网站](https://map.jiqrxx.com/jingweidu/)读取统计的信息存储到容器其他的一些相关函数debug 显示存储的信息更新最小最大经纬度的函数获取两点之间的距离 根据经纬度 定义所需要的容器 extern QMap<QStrin…

寻找单身狗

在一个数组中仅出现一次&#xff0c;其他数均出现两次&#xff0c;这个出现一次的数就被称为“单身狗“。 一.一个单身狗 我们知道异或运算操作符 ^ &#xff0c;它的特点是对应二进制位相同为 0&#xff0c;相异为 1。 由此我们容易知道两个相同的数,进行异或运算得到的结果…

tkinter的Canvas组件,绘画基本知识

一、说明 画布组件是Tkinter画图的最重要组件。画布对象是几何绘制、动画绘制的不二选项&#xff0c;本文专门对画布Canvas进行详细描述&#xff0c;并配以适当代码支持。 二、tkinter的Canvas组件&#xff0c;绘画基本知识 Canvas组件&#xff0c;可以用来绘图&#xff0c;也…

【Java 基础篇】Java反射详解:深入了解Java的镜像世界

Java是一门面向对象的编程语言&#xff0c;其强大之处之一就是能够在运行时检查、获取和操作类、方法、字段等程序元素。这一特性就是通过Java的反射机制实现的。本文将深入介绍Java反射&#xff0c;包括它的基本概念、使用方法、常见应用场景和注意事项。无需担心&#xff0c;…

云计算战略:选择适合你业务的云平台

文章目录 云计算的概述选择云平台的关键因素1. 业务需求2. 预算3. 性能要求4. 数据隐私和合规性 示例&#xff1a;选择适合的云平台业务需求预算性能要求数据隐私和合规性 代码示例&#xff1a;使用云平台服务结论 &#x1f389;欢迎来到云计算技术应用专栏~云计算战略&#xf…

“源启2.0”:从自上而下的解构,到自下而上的重构

从垂直打穿、到应用重构&#xff0c;中电金信赋能行业数字化转型之路既“向下走”、也“向上看”。“向上”先理解和吃透客户的企业战略&#xff0c;进而自上而下地将企业战略拆解为业务架构&#xff0c;“向下”再将业务架构拆解为应用架构和数据架构&#xff0c;并进一步对齐…

JS预解析/编译(变量提升):var(仅声明,无赋值)、function变量 创建作用域

目录 变量提升/预定义 function和var 重名&#xff1a;函数覆盖变量 不执行代码 重复声明&#xff1a;只提升一次 函数形参&#xff1a;变量提升 带 var 和不带 var 全局作用域&#xff1a; window 的属性 私有/函数作用域&#xff1a; 带 var 的是私有变量 IIFE 函…

Linux 终端与进程

有趣的问题 Linux 中的 终端&#xff0c;控制台&#xff0c;TTY&#xff0c;PTY 究竟是什么&#xff1f;它们与进程有什么关系&#xff1f; 历史回顾&#xff1a;控制台 (Console) 控制台是一个直接控制设备的面板 (属于设备的一部分) 计算机设备的控制台&#xff1a;按键 &…

2FSK调制解调VHDL,Quartus

名称&#xff1a;2FSK调制解调VHDL&#xff08;代码在文末付费下载&#xff09; 软件&#xff1a;Quartus 语言&#xff1a;VHDL 要求&#xff1a;使用VHDL实现2FSK的调制和解调&#xff0c;并进行仿真 代码下载&#xff1a;2FSK调制解调VHDL,Quartus_Verilog/VHDL资源下载…

C++ stack queue模拟实现

目录 一.stack 二.queue 三.deque STL中有6大组件&#xff0c;我们前面讲的string/vector/list是容器&#xff0c;还有迭代器&#xff0c;以及算法&#xff08;比如find&#xff0c;swap&#xff0c;reverse&#xff0c;sort&#xff0c;merge函数&#xff09;&#xff0c;仿函…

【Java 基础篇】Java Stream 流详解

Java Stream&#xff08;流&#xff09;是Java 8引入的一个强大的新特性&#xff0c;用于处理集合数据。它提供了一种更简洁、更灵活的方式来操作数据&#xff0c;可以大大提高代码的可读性和可维护性。本文将详细介绍Java Stream流的概念、用法和一些常见操作。 什么是Stream…

bootstrapv4轮播图去除两侧阴影及线框的方法

文章目录 前言一、前提条件&#xff1a;二、bootstrap文档组件展示与实际应用1.官方文档展示如下&#xff1a;没有阴影2.实际应用情况如下&#xff1a; 三、解决方案 前言 这篇文章主要介绍了bootstrapv4轮播图去除两侧阴影及线框的方法,本文通过示例代码给大家介绍的非常详细…

基于微信小程序的项目申报管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言用户微信端的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉…

【Vue】vue-cli一站式搭建SPA项目

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Vue快速入门》。&#x1f3af;&#x1f3af; &…

vtk- 数据类型(一) 三角链实例代码

三角链实例代码 #include <iostream> #include <string> #include <regex> #include "tuex.h" #include "vtkCylinderSource.h" #include "vtkPolyDataMapper.h" #include "vtkActor.h" #include "vtkRendere…

Java --- MySQL8数据库优化性能查看工具

目录 一、数据库服务器优化步骤 ​编辑二、查看系统性能的参数 三、统计SQL的查询成本&#xff1a;last_query_cost 四、定位执行慢的SQL&#xff1a;慢日志查询 4.1、开启并设置慢查询日志查询参数 4.2、查看慢查询数目 4.3、慢查询日志分析工具&#xff1a;mysqldumps…