C#属性 Property

属性Property不是变量。 它们是由名为访问器方法来实现的一种方法。

实例属性表示的是实例的某个数据,通过这个数据反映实例当前的状态

静态属性表示的是类型的某个数据,通过这个数据反映类型当前的状态

意义:

防止恶意赋值(通过属性间接访问字段,对字段的一种保护),通过在Get和Set访问器函数中增加一些限制,对赋值进行合法检验防止污染字段。

语法(糖):

 

自动实现的属性

如果在访问器中没有任何附加逻辑可写成语法糖的样式。与一个共有字段没区别,不受保护,一般用在传递数据的类(即不需要取改的类,只传递)

属性进化史

未对字段进行保护

添加属性保护字段

由于赋值和取值的两个方法很冗余不如直接给变量赋值的清晰,因此MS创造了“属性”一概念

简洁多了,赋值从stu1.SetAge(10)变成stu.Age = 10;取值从stu1.GetAge()变成stu1.Age

属性的初始化

隐藏字段

 如果没有显式声明属性对应的字段,直接声明属性,编译器会自动生成的隐藏字段

访问控制

PS:同一类内的属性之间,无论什么修饰符,都可以互相访问到。

属性可以是读-写属性(既有 get 访问器又有 set 访问器)

只读属性(有 get 访问器,但没有 set 访问器)只读是针对类外的,类外因为字段被private的modifier修饰,因此只能通过属性访问字段,而类内不受private影响可以不通过属性访问字段

只写访问器(有 set 访问器,但没有 get 访问器)。 只写属性很少见

set 访问器有两个特殊的访问修饰符:

  • set 访问器可以将 init 作为其访问修饰符。 只能从对象初始值设定项或类型的构造函数调用该 set 访问器。 它比 set 访问器上的 private 更严格。
  • 自动实现的属性可以在不使用访问器的情况下set声明get访问器。 在这种情况下,编译器只允许从类型的构造函数调用 set 访问器。 它比 set 访问器上的 init 访问器更严格。

不写set和将set用private修饰是不同的效果:

1.不写set:无论类内外给属性赋值,报错只读属性不能被赋值。类内也依然可以改变其值,因为不受private影响而绕开属性,直接给字段赋值即可

2.写set但用private修饰:如果从声明这个字段的类外访问会报错:set访问器不可访问。setter不能从类外部访问,只能从类内部访问,可通过类内对Age进行赋值

抽象属性(Abstract Properties)

抽象类可拥有抽象属性,这些属性应在派生类中被实现。下面的程序说明了这点:

using System;
namespace Runoob
{
    public abstract class Person
    {
        public abstract string Name { get; set; }
        public abstract int Age { get; set; }
    }

    class Student : Person
    {
        // 声明自动实现的属性
        public string Code { get; set; } = "N.A";
        public override string Name { get; set; } = "N.A";
        public override int Age { get; set; } = 0;

        public override string ToString()
        {
            return $"Code = {Code}, Name = {Name}, Age = {Age}";
        }
    }

    class ExampleDemo
    {
        public static void Main()
        {
            // 创建一个新的 Student 对象
            Student s = new Student
            {
                Code = "001",
                Name = "Zara",
                Age = 9
            };

            Console.WriteLine("Student Info:- {0}", s);
            
            // 增加年龄
            s.Age += 1;
            Console.WriteLine("Student Info:- {0}", s);

            Console.ReadKey();
        }
    }
}

Reference

擅码网面向对象基础之字段属性

刘铁猛C#教程

属性 - C# | Microsoft Learn

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第八篇: 通过使用Google BigQuery进行数据批量和自动化处理

使用Python进行Google BigQuery数据批量和自动化处理 在大数据分析的日常工作中,定期更新、查询和处理数据是一项必不可少的任务。Google BigQuery结合Python脚本,可大幅简化这一过程。本文将介绍如何通过Python自动查询和更新BigQuery中的降水量数据&a…

AI - 人工智能;Ollama大模型工具;Java之SpringAI(三)

AI - 人工智能;Java之SpringAI(一) AI - 人工智能;Java之SpringAI(二) 一、Ollama 官网:https://ollama.com/ Ollama是一个大模型部署运行工具,在该工具里面可以部署运行各种大模型…

MySQL_数据类型建表

复习: 我们昨天学习的知识都忘了嘛?如果忘了也不要担心,我来带大家来复习一遍吧!!! 1.查看所有数据库 show databases;2.创建属于自己的数据库 create database 数据库名; 检查自己创建的数据库是…

零基础入门进程间通信:task 1(匿名管道与vscode使用)

目录 引言 VSCODE使用 进程间通信正题 基础背景 进程间通信分类 匿名管道 理解匿名管道 代码实现 匿名管道的特性 管道的四种情况 应用场景 引言 在当今的计算机技术领域,操作系统作为计算机系统的核心组件,承担着资源管理、任务调度和进程管…

Vue 3 的 全局状态管理

1.思路梳理 工厂仓拣货信息:Factory Picking Info (FPI)工厂仓调度信息:Factory Scheduling Info (FSI)DC 收货信息:DC Receiving Info (DCRI)上架信息:Shelving Info (SI)盘点信息:Inventory Count Info (ICI)移位信…

Win系统通过命令行查看笔记本电池损耗/寿命/健康

在 Windows 10/11 系统中,可以通过指令查看笔记本电池的寿命情况,方法如下: 0,打开cmd/终端 键盘快捷键:Win R,然后输入cmd,点击【确定】 1,执行命令 在命令行中输入下面指令并按…

【DM系列】DM 集成 JDBC 开发指南

前言 数据库访问是数据库应用系统中非常重要的组成部分,DM 作为一个通用数据库管理系统,提供了多种数据库访问接口,包括 ODBC、JDBC、DPI 等方式。本开发指南详细介绍了 DM 的各种访问接口、相应开发环境的配置、以及一些开发用例。本指南的主…

【客观理性深入讨论国产中间件及数据库-科创基础软件】

随着国产化的进程,越来越多的国企央企开始要求软件产品匹配过程化的要求, 最近有一家银行保险的科技公司对行为验证码产品就要求匹配国产中间件, 于是开始了解国产中间件都有哪些厂家 一:国产中间件主要产品及厂商 1 东方通&…

python opencv3

三、图像预处理2 1、图像滤波 为图像滤波通过滤波器得到另一个图像。也就是加深图像之间的间隙,增强视觉效果;也可以模糊化间隙,造成图像的噪点被抹平。 2、卷积核 在深度学习中,卷积核越大,看到的信息越多&#xff0…

数据库管理-第258期 23ai:Oracle Data Redaction(20241104)

数据库管理258期 2024-11-04 数据库管理-第258期 23ai:Oracle Data Redaction(20241104)1 简介2 应用场景与有点3 多租户环境4 特性与能力4.1 全数据编校4.2 部分编校4.3 正则表达式编校4.4 随机编校4.5 空值编校4.6 无编校4.7 不同数据类型上…

Kettle——CSV文件转换成excel文件输出

1.点击—文件—新建—转换 拖入两个组件: 按shift+鼠标左击建立连接,并点击主输出步骤, 点击CSV文件输入,选择浏览的csv文件,然后点击确定 同样,Excel也同上,只是要删除这个xls 并…

【数据集】【YOLO】【目标检测】火情、烟雾、火灾检测数据集 9848 张,YOLO火灾检测算法实战训练教程!

数据集介绍 【数据集】火情、烟火、火灾检测数据集 9848 张,目标检测,包含YOLO/VOC格式标注。 数据集中包含2种分类:{0: Fire, 1: Smoke},分别是‘火焰’和‘烟雾’。 数据集来自国内外图片网站和视频截图; 可用于…

Python酷库之旅-第三方库Pandas(202)

目录 一、用法精讲 941、pandas.CategoricalIndex.set_categories方法 941-1、语法 941-2、参数 941-3、功能 941-4、返回值 941-5、说明 941-6、用法 941-6-1、数据准备 941-6-2、代码示例 941-6-3、结果输出 942、pandas.CategoricalIndex.as_ordered方法 942-1…

docker 拉取MySQL8.0镜像以及安装

目录 一、docker安装MySQL镜像 搜索images 拉取MySQL镜像 二、数据挂载 在/root/mysql/conf中创建 *.cnf 文件 创建容器,将数据,日志,配置文件映射到本机 检查MySQL是否启动成功: 三、DBeaver数据库连接 问题一、Public Key Retrieval is not allowed 问题…

Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized

这里是Themberfue 在上一节的最后,我们讨论两个线程同时对一个变量累加所产生的现象 在这一节中,我们将更加详细地解释这个现象背后发生的原因以及该如何解决这样类似的现象 线程安全问题 public class Demo15 {private static int count 0;public …

如何使用RabbitMQ和Python实现广播消息

使用 RabbitMQ 和 Python 实现广播消息的过程涉及设置一个消息队列和多个消费者,以便接收相同的消息。RabbitMQ 的 “fanout” 交换机允许你将消息广播到所有绑定的队列。以下是如何实现这一过程的详细步骤。 1、问题背景 在将系统从Morbid迁移到RabbitMQ时&#x…

【RabbitMQ】04-发送者可靠性

1. 生产者重试机制 spring:rabbitmq:connection-timeout: 1s # 设置MQ的连接超时时间template:retry:enabled: true # 开启超时重试机制initial-interval: 1000ms # 失败后的初始等待时间multiplier: 1 # 失败后下次的等待时长倍数,下次等待时长 initial-interval…

java的类加载机制的学习

一、类加载的过程 一个类被加载到虚拟机内存中开始,到卸载出虚拟机内存为止,整个生命周期分为七个阶段,分别是加载、验证、准备、解析、初始化、使用和卸载。其中验证、准备和解析这三个阶段统称为连接。 除去使用和卸载,就是Ja…

uni-app跨域set-cookie

set-cookie的值是作为一个权限控制的 首先,无论什么接口都会返回一个set-cookie,但未登录时,set-cookie是没有任何权限的 其次,登录接口请求时会修改set-cookie,并且在后续其他接口发起请求时,会在请求头…

让智能体—“正念365”陪你一起“养心”

佛学的“八正道”中,笔者个人观点,“正念”是最适合当代人低门槛练习的一个,因为不需要阅读大量的知识来理解概念,只需要保持对当下的觉察,发现分心了,就不带评价的把注意力拉回到当前的事情上就好。就是佛…