C#属性 Property

news/2024/11/5 11:20:23 标签: c#

属性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


http://www.niftyadmin.cn/n/5739406.html

相关文章

微服务day01

MybatisPlus Mp入门 基本步骤 引入MybatisPlus依赖&#xff0c;代替Mybatis依赖 <dependency> <groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </…

命令kill

kill命令用于终止进程 kill [options] <PID> options 选项 kill -9 要强制终止进程 默认情况下&#xff0c;kill 命令发送的是终止信号&#xff08;SIGTERM&#xff0c;信号编号 15&#xff09;&#xff0c;大多数进程在接收到这个信号后会正常结束。 如果进程没有响应…

arm64-v8a 和 armeabi-v7a 有啥区别?

ARM64-v8a 和 ARMEABI-v7a 是 Android 平台上两种不同的 ARM 架构&#xff0c;用于支持应用程序的运行。它们之间有几个关键的区别&#xff1a; 1. 架构类型 ARM64-v8a&#xff1a;代表的是 64 位的 ARM 架构&#xff08;ARMv8-A&#xff09;。它能够处理更大范围的地址空间和…

angular实现list列表和翻页效果

说明&#xff1a;angular实现list列表和翻页效果 上一页 当前页面 下一页 效果图&#xff1a; step1: E:\projectgood\ajnine\untitled4\src\app\car\car.component.css .example-form-fields {display: flex;align-items: flex-start; }mat-list-item{background: antiquew…

MongoDB笔记02-MongoDB基本常用命令

文章目录 一、前言二、数据库操作2.1 选择和创建数据库2.2 数据库的删除 3 集合操作3.1 集合的显式创建3.2 集合的隐式创建3.3 集合的删除 四、文档基本CRUD4.1 文档的插入4.1.1 单个文档插入4.1.2 批量插入 4.2 文档的基本查询4.2.1 查询所有4.2.2 投影查询&#xff08;Projec…

接口测试(十)jmeter——关联(正则表达式提取器)

一、正则表达式 常用的元字符 元字符&#xff1a;用来匹配相关字符 万能匹配表达式&#xff1a; .*? 所有log结尾的文件&#xff1a;*.log 代码说明.匹配除换行符以外的任意字符\w匹配字母或数字或下划线或汉字\s匹配任意的空白符\d匹配数字\b匹配单词的开始或结束^匹配字符…

基于Prometheus的client_golang库实现应用的自定义可观测监控

文章目录 1. 安装client_golang库2. 编写可观测监控代码3. 运行效果4. jar、graalvm、golang编译运行版本对比 前文使用javagraalvm实现原生应用可观测监控&#xff1a; prometheus client_java实现进程的CPU、内存、IO、流量的可观测&#xff0c;但是部分java依赖包使用了复杂…

基于SpringBoot的母婴商城的设计与实现

一、项目背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理。这样的大环境让那些止步不前&#xff0c;…