C#属性介绍

文章目录

  • 一、简要介绍
  • 二、详细介绍
    • 2.1 例子
    • 2.2 属性和字段的比较
    • 2.3 自动实现属性
    • 2.4 静态属性
    • 2.5 只读/只写属性
    • 2.6 属性可访问性
    • 2.7 接口声明属性
    • 2.8 使用初始化器初始化属性

一、简要介绍

属性是代表类的实例或者类中的一个数据项的成员。
属性是字段和方法的交集,指的是一组两个匹配的访问器方法。
下面是属性的基本形式

public 返回类型 标识符{set 访问器为属性赋值;get 访问器为属性获取值;
}

属性包含两个代码块,分别以get和set关键字开头。

  • get块包含读取属性时候执行的语句
  • set块包含在向属性写入时执行的语句。

set访问器和get访问器的特点如下:

  • set访问器
    1. 拥有一个单独的、隐式的参数value,其类型与属性的相同
    2. set访问器返回类型为void
  • get访问器
    1. 没有参数
    2. 拥有一个与属性类型相同的返回值。

public 这样的修饰符是可选的,可以选择私有的,这样就不可以在类外直接访问 set 和 get 访问器

通常将类中的字段声明private以封装该字段, 然后声明一个public的属性来控制从类的外部对该字段的访问。

与属性关联的字段称为后备字段。

一般习惯把私有方法和字段以小写字母开头,公共方法和字段以大写字母开头。

使用属性和使用字段是一样的语法

  • 从属性取值时,编译器自动将字段风格的代码转换成对属性的get访问器的调用。
  • 向属性赋值时,编译器自动将字段风格的代码转换成对该属性的set访问器的调用。

二、详细介绍

2.1 例子

using System;namespace PropertyDemo
{internal class Program{static void Main(string[] args){PropertyDemo propertyDemo = new PropertyDemo();propertyDemo.Name = "yyrwkk";Console.WriteLine(propertyDemo.Name);Console.ReadKey();}}public class PropertyDemo{private string name;public string Name{get { return name; }set { name = value; }}}
}

可以简化语句

public string Name {get => name;set => name = value;
}

2.2 属性和字段的比较

  1. 属性本质是方法而非字段。
  2. 只有在结构或类初始化好之后,才能通过该结构或类的属性赋值。
  3. 不能将属性作为ref或out参数传给方法,因为属性并不真正执行一个内存位置,它指向的是一个访问器方法。
  4. 属性最多只能包含一个get和一个set访问器,不能包含其他方法、字段和属性。
  5. get和set访问器不能获取任何参数。要赋的值会通过内建的、隐藏的value变量自动传给set访问器
  6. 不能声明const属性

属性跟字段的相同点

  • 都是命名的实例成员
  • 都有类型
  • 都可以被赋值和读取

属性和字段的不同点

  • 属性实际上是一个成员函数
  • 不为数据存储分配内存
  • 属性可以只读或者只写。

2.3 自动实现属性

允许只声明属性而不声明后备字段,编译器会创建隐藏的后备字段,并且自动挂接到get或者set访问器上。

自动实现属性的要点:

  1. 不声明后备字段,编译器根据属性的类型分配存储。
  2. 不能提供访问器的方法体。
  3. 自动实现的属性本身会自动分配内存。
  4. 可以创建只读自动属性,但是不能创建只写自动属性。
using System;namespace PropertyDemo
{internal class Program{static void Main(string[] args){PropertyDemo propertyDemo = new PropertyDemo();propertyDemo.Name = "yyrwkk";Console.WriteLine(propertyDemo.Name);Console.ReadKey();}}public class PropertyDemo{//private string name;public string Name{get;set;}}
}

2.4 静态属性

属性可以声明为static,静态属性的访问器和所有静态成员一样。

  • 不能访问类的实例成员,但是可以访问类的静态成员
  • 当从类的外部访问时,必需使用类名进行引用。
using System;namespace PropertyDemo
{internal class Program{static void Main(string[] args){PropertyDemo.Name = "yyrwkk";Console.WriteLine(PropertyDemo.Name);Console.ReadKey();}}public class PropertyDemo{//private string name;public static string Name {get;set;}}
}

2.5 只读/只写属性

可声明只含get访问器的属性,这称为只读属性,无法修改。

public string Name{get => name;
}

声明只含set访问器的属性,称为只写属性,无法读取。

public string Name {set => Name = value;
}

只写属性适用于对密码这样的数据进行保护。

2.6 属性可访问性

声明属性时可以指定可访问性
在属性声明中,可以为set和get访问器单独指定可访问性,从而覆盖属性的可访问性

class PropertyDemo{private string name;public string Name {get => name;private set => name = value;}
}

Name的get访问器就是public的,而Name的set访问器就是private的

2.7 接口声明属性

在接口中可以声明属性

interface Position{int X {get;set;}int Y {get;set;}
}

实现接口的任何类或者结构都必须实现X和Y属性。
接口中的属性不能指定访问修饰符。

2.8 使用初始化器初始化属性

使用属性初始化对象

using System;namespace PropertyDemo
{internal class Program{static void Main(string[] args){PropertyDemo propertyDemo = new PropertyDemo() { Age=19,Name="yyrwkk" };Console.WriteLine(propertyDemo.Name);Console.ReadKey();}}public class PropertyDemo{public int Age { get; set; }public string Name { get; set; }}
}

调用对象初始化器,C#编译器会自动生成代码来调用默认构造器,然后调用每个具名属性的set访问器,把它们初始化成指定值。

还可以使用自定义的构造函数

using System;namespace PropertyDemo
{internal class Program{static void Main(string[] args){PropertyDemo propertyDemo = new PropertyDemo(175) { Age=19,Name="yyrwkk" };Console.WriteLine(propertyDemo.Name);Console.ReadKey();}}public class PropertyDemo{private int height;public int Age { get; set; }public string Name { get; set; }public PropertyDemo(int height){this.height = height;}}
}

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

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

相关文章

【大数据进阶第二阶段之Hadoop学习笔记】Hadoop 运行模式

【大数据进阶第二阶段之Hadoop学习笔记】Hadoop 概述-CSDN博客 【大数据进阶第二阶段之Hadoop学习笔记】Hadoop 运行环境搭建-CSDN博客 【大数据进阶第二阶段之Hadoop学习笔记】Hadoop 运行模式-CSDN博客 目录 1、Hadoop运行模式 2、 编写集群分发脚本 xsync 2.1、scp (se…

判断线性相关性

线性相关是线性代数中的一个重要概念,用于描述向量或向量组之间的线性关系。以下是判断向量组是否线性相关的几种方法: 1. **根据定义判断**: - 如果存在一组不全为零的系数,使得这些系数与对应的向量组相乘后相加等于零向量&a…

如何为项目创建高效的项目进度表?

项目管理是一项负有巨大责任的工作,涉及到完成项目所需的大量流程和任务。如果没有任务和责任的线路图,很容易就偏离方向,无法了解项目每个阶段需要完成的任务。这就是为什么项目进度表是成功执行项目的核心所在。 什么是项目进度表&#xff…

MSVCR100.dll丢失,程序无法启动,快速修复,亲测有效

很多用户,在日常使用电脑的过程中都遇到过,电脑报错“程序由于缺失MSVCR100.dll文件,无法启动,需要重新安装解决”,不少用户卸载软件重装后,还是报错,那么应该怎么解决呢? 首先&…

FastApi-快速入门1

FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.8 并基于标准的 Python 类型提示。 关键特性: 快速:可与 NodeJS 和 Go 并肩的极高性能(归功于 Starlette 和 Pydantic)。最快…

「实验记录」CS144 Lab1 StreamReassembler

目录 一、Motivation二、SolutionsS1 - StreamReassembler的对外接口S2 - push_substring序列写入ByteStream 三、Result四、My Code五、Reference 一、Motivation 我们都知道 TCP 是基于字节流的传输方式,即 Receiver 收到的数据应该和 Sender 发送的数据是一样的…

vue-cli项目中vue.config.js的配置

vue-cli项目中vue.config.js的配置 一、直接上代码 一、直接上代码 let path require(path) let glob require(glob)function resolve(dir) {return path.join(__dirname, src/${dir}) }module.exports {pages: {index: {// page 的入口entry: src/main.js,// 模板来源temp…

Java学习笔记

Java学习笔记 java发展先按黑马尚硅谷的路线来吧部分项目代码参考 第一阶段:JavaSE基础9天 中文API可以看菜鸟教程里的 java发展 jdk8后最大改变:lambda,stream 先按黑马尚硅谷的路线来吧 https://blog.csdn.net/qq_40991313/article/deta…

Spring Boot日志配置

在今天的数字化时代,日志记录已经成为任何应用程序不可或缺的一部分,它们是我们理解系统行为、诊断问题和监控应用性能的关键。对于使用Spring Boot的开发者来说,有效的日志管理就像是进行一场精确的数据舞蹈,需要精心编排每一个步…

198.【2023年华为OD机试真题(C卷)】万能字符单词拼写(JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-万能字符单词拼写二.解题思路三.题解代码Pytho…

常用免费好用API汇总

短信验证码:可用于登录、注册、找回密码、支付认证等等应用场景。支持三大运营商,3秒可达,99.99%到达率,支持大容量高并发。通知短信:当您需要快速通知用户时,通知短信是最快捷有效的方式。短信…

为什么需要在bean上使用@EqualsAndHashCode(callSuper = true)这个注解

我们还是写一个案例,来探讨它的作用。 写三个类,一个是子类Child.class,一个是父类Person.class,一个是测试类Test.class Person父类很简单,就一个属性code; Child子类也很简单,继承了父类之后…

Java实现汉字拼音转换和关键字分词(pinyin4j、hanlp)

文章目录 pinyin4jhanlp关键字分词 pinyin4j 添加maven依赖 <dependency><groupId>com.belerweb</groupId><artifactId>pinyin4j</artifactId><version>2.5.0</version> </dependency>获取文本拼音 /*** 获取文本拼音* para…

计算机组成原理-总线标准(系统总线 局部总线 设备总线)

文章目录 总览例子总线标准的基本概念系统总线标准局部总线标准设备总线标准对比小结为何串行总线取代并行总线 总览 例子 总线标准的基本概念 北桥芯片速度大于南桥芯片 系统总线标准 ISA和EISA都是并行总线 Intel提出了FBS总线标准比EISA和ISA快&#xff0c;后来又提出来…

LeetCode(31) 下一个排列

整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下这些都可以视作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地&#xf…

linux没有在/etc/passwd里的用户如何修改默认 shell(zsh)

找了半天终于找到解决办法&#xff0c;记录一下&#xff01; 不在/etc/passwd, 是因为用户数据库存储在其他地方&#xff0c;例如LDAP 这样的话&#xff0c;只能在.bashrc最后&#xff0c;添加 exec -l zsh 就是每次先登入到bash再切到zsh&#xff0c;不这样的话每次登入ba…

创作活动(七十一)———编程语言未来的发展方向

#编程语言的未来&#xff1f;# 随着科技的飞速发展&#xff0c;编程语言在计算机领域中扮演着至关重要的角色。它们是软件开发的核心&#xff0c;为程序员提供了与机器沟通的桥梁。那么&#xff0c;在技术不断进步的未来&#xff0c;编程语言的走向又将如何呢&#xff1f; 编…

数据结构期末复习(1)数据结构和算法 线性表

数据结构期末总复习&#xff08;gaois课堂版&#xff09; 数据结构的概念 数据结构是计算机科学中的一个重要概念&#xff0c;它指的是组织和存储数据的方式。数据结构可以帮助我们高效地操作和管理数据&#xff0c;使得计算机程序能够更加有效地执行各种任务。 数据结构有很…

防火墙未开端口导致zookeeper集群异常,kafka起不来

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 问题描述&#xff1a; 主机信息&#xff1a; IPhostname10.0.0.10host1010.0.0.12host1210.0.0.13host13 在这三台主机上部署…

山西电力市场日前价格预测【2024-01-05】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-01-05&#xff09;山西电力市场全天平均日前电价为259.10元/MWh。其中&#xff0c;最高日前电价为363.99元/MWh&#xff0c;预计出现在18:00。最低日前电价为0.00元/MWh&#xff0c;预计出…