属性概述

  • 属性允许类公开获取和设置值的公共方法,而隐藏实现或验证代码。

  • get 属性访问器用于返回属性值,而 set 属性访问器用于分配新值。 这些访问器可以具有不同的访问级别。 有关详细信息,请参阅限制访问器可访问性

  • value 关键字用于定义由 set 访问器分配的值。

  • 属性可以是读-写属性(既有 get 访问器又有 set 访问器)、只读属性(有 get 访问器,但没有 set 访问器)或只写访问器(有 set 访问器,但没有 get 访问器)。 只写属性很少出现,常用于限制对敏感数据的访问。

  • 不需要自定义访问器代码的简单属性可以作为表达式主体定义或自动实现的属性来实现。

具有支持字段的属性

有一个实现属性的基本模式,该模式使用私有支持字段来设置和检索属性值。 get 访问器返回私有字段的值,set 访问器在向私有字段赋值之前可能会执行一些数据验证。 这两个访问器还可以在存储或返回数据之前对其执行某些转换或计算。

下面的示例阐释了此模式。 在此示例中,TimePeriod 类表示时间间隔。 在内部,该类将时间间隔以秒为单位存储在名为 _seconds 的私有字段中。 名为 Hours 的读-写属性允许客户以小时为单位指定时间间隔。 get 和 set 访问器都会执行小时与秒之间的必要转换。 此外,set 访问器还会验证数据,如果小时数无效,则引发 ArgumentOutOfRangeException

C#复制

 
using System;

class TimePeriod
{
private double _seconds; public double Hours
{
get { return _seconds / 3600; }
set {
if (value < 0 || value > 24)
throw new ArgumentOutOfRangeException(
$"{nameof(value)} must be between 0 and 24."); _seconds = value * 3600;
}
}
} class Program
{
static void Main()
{
TimePeriod t = new TimePeriod();
// The property assignment causes the 'set' accessor to be called.
t.Hours = 24; // Retrieving the property causes the 'get' accessor to be called.
Console.WriteLine($"Time in hours: {t.Hours}");
}
}
// The example displays the following output:
// Time in hours: 24

表达式主体定义

属性访问器通常由单行语句组成,这些语句只分配或只返回表达式的结果。 可以将这些属性作为 expression-bodied 成员来实现。 => 符号后跟用于为属性赋值或从属性中检索值的表达式,即组成了表达式主体定义。

从 C# 6 开始,只读属性可以将 get 访问器作为 expression-bodied 成员实现。 在这种情况下,既不使用 get 访问器关键字,也不使用 return 关键字。 下面的示例将只读 Name 属性作为 expression-bodied 成员实现。

C#复制

 
using System;

public class Person
{
private string _firstName;
private string _lastName; public Person(string first, string last)
{
_firstName = first;
_lastName = last;
} public string Name => $"{_firstName} {_lastName}";
} public class Example
{
public static void Main()
{
var person = new Person("Magnus", "Hedlund");
Console.WriteLine(person.Name);
}
}
// The example displays the following output:
// Magnus Hedlund

从 C# 7.0 开始,get 和 set 访问器都可以作为 expression-bodied 成员实现。 在这种情况下,必须使用 get 和 set 关键字。 下面的示例阐释如何为这两个访问器使用表达式主体定义。 请注意,return 关键字不与 get 访问器搭配使用。

C#复制

 
using System;

public class SaleItem
{
string _name;
decimal _cost; public SaleItem(string name, decimal cost)
{
_name = name;
_cost = cost;
} public string Name
{
get => _name;
set => _name = value;
} public decimal Price
{
get => _cost;
set => _cost = value;
}
} class Program
{
static void Main(string[] args)
{
var item = new SaleItem("Shoes", 19.95m);
Console.WriteLine($"{item.Name}: sells for {item.Price:C2}");
}
}
// The example displays output like the following:
// Shoes: sells for $19.95

自动实现的属性

在某些情况下,属性 get 和 set 访问器仅向支持字段赋值或仅从其中检索值,而不包括任何附加逻辑。 通过使用自动实现的属性,既能简化代码,还能让 C# 编译器透明地提供支持字段。

如果属性具有 get 和 set 访问器,则必须自动实现这两个访问器。 自动实现的属性通过以下方式定义:使用 get 和 set 关键字,但不提供任何实现。 下面的示例与上一个示例基本相同,只不过 Name 和 Price 是自动实现的属性。 请注意,该示例还删除了参数化构造函数,以便通过调用无参数构造函数和对象初始值设定项立即初始化 SaleItem 对象。

C#复制

 
using System;

public class SaleItem
{
public string Name
{ get; set; } public decimal Price
{ get; set; }
} class Program
{
static void Main(string[] args)
{
var item = new SaleItem{ Name = "Shoes", Price = 19.95m };
Console.WriteLine($"{item.Name}: sells for {item.Price:C2}");
}
}
// The example displays output like the following:
// Shoes: sells for $19.95

C# 属性概述的更多相关文章

  1. HTML5系列一(属性概述)

    HTML5概述 HTML5於2004年被WHATWG(网页超文本技术工作小组)提出,於2007年被W3C接纳 在2008年1月22日,第一份正式草案已公布.WHATWG表示该规范是目前正在进行的工作, ...

  2. XML中<beans>中属性概述

    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w ...

  3. Spring 配置文件XML -- <beans>中属性概述

    beans : xml文件的根节点. xmlns : XML NameSpace的缩写,因为XML文件的标签名称都是自定义的,自己写的和其他人定义的标签很有可能会重复命名,而功能却不一样,所以需要加上 ...

  4. js nextSibling属性和previousSibling属性概述及使用注意

    1:nextSibling属性 该属性表示当前节点的下一个节点(其后的节点与当前节点同属一个级别):如果其后没有与其同级的节点,则返回null. 需要特别注意的是:该属性在不同的浏览器中的执行结果并不 ...

  5. spring applicationContext.xml中<beans>中属性概述

    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w ...

  6. 【Web】block、inline、inline-block元素与background属性概述(案例实现社交账号注册按钮效果)

    步骤三:社交账号注册按钮效果 文章目录 步骤三:社交账号注册按钮效果 案例的演示与分析 CSS属性与HTML标签 块级元素 内联元素 行内块级元素 CSS的display属性 CSS中的背景图片属性 ...

  7. css中background背景属性概述

    background:url(背景图片路径) no-repeat;/*不重复默认在左上方*/ background:url(背景图片路径) no-repeat center;/*不重复背景图片中间显示 ...

  8. [UWP]依赖属性2:使用依赖属性

    5. 完整的自定义依赖属性 5.1 定义 /// <summary> /// 标识 Title 依赖属性. /// </summary> public static reado ...

  9. Django所包含属性

    Django包含的属性 定义属性 概述: 1.django根据属性的类型确定以下信息 2.当前选择的数据库支持字段的类型 3.渲染管理表单时使用的默认html空间 4.在管理站点最低限度的验证 注意: ...

  10. C#中真正的属性

    引言 我们以前课堂上说的类当中的“属性”,其实官方叫法是“字段”或者“域”域(Field).正常使用,把它们当属性理解更加方便快捷,也没有什么问题. 如果要在微软的mvc中充分利用类带来的便利,就有必 ...

随机推荐

  1. 新来个架构师,用48张图把OpenFeign原理讲的炉火纯青~~

    大家好,我是三友~~ 在很久之前,我写过两篇关于OpenFeign和Ribbon这两个SpringCloud核心组件架构原理的文章 但是说实话,从我现在的角度来看,这两篇文章的结构和内容其实还可以更加 ...

  2. Hello-FPGA CoaXPress 2.0 FPGA DEVICE IP Core Demo

    Hello-FPGA CoaXPress 2.0 Device FPGA IP Core Demo 1     说明 本手册针对Helllo-FPGA的CoaXPress 2.0 DEVICE FPG ...

  3. 在 C++ 项目中,通过源码使用 PaddlePaddle 实现 OCR 功能

    My-PaddleOCR 介绍 如何在 C++ 项目中,通过源码使用 PaddlePaddle 实现 OCR 功能. 本项目的所有源码:gitee: paddleocr 目前,官方提供使用 Paddl ...

  4. 设置 sudo 无需输入密码

    * 设置 sudo 无需输入密码,如下:* [root@localhost ~]# visudo* 在"root ALL=(ALL) ALL"这一行下面,再加入一行:* 将原来的: ...

  5. 关于centos安装32位兼容库找不到依赖包的问题

    可以看这个博主写的  https://blog.csdn.net/ai74le/article/details/87195077

  6. php编写日历类

    <?php /** * 日历类 * Class Calendar * @author fengzi * @date 2022-05-05 15:42 */ class Calendar{ pro ...

  7. PaddleOCR 服务化部署(基于PaddleHub Serving)

    最近用到百度飞桨的 PaddleOCR,研究了一下PaddleOCR的服务化部署,简单记录一些部署过程和碰到的问题. 基础环境 paddlepaddle 2.5.2 python 3.7 paddle ...

  8. 面试准备不充分,被Java守护线程干懵了,面试官主打一个东西没用但你得会

    写在开头 面试官:小伙子请聊一聊Java中的精灵线程? 我:什么?精灵线程?啥时候精灵线程? 面试官:精灵线程没听过?那守护线程呢? 我:守护线程知道,就是为普通线程服务的线程嘛. 面试官:没了?守护 ...

  9. 基于STM32F407MAC与DP83848实现以太网通讯三(STM32F407MAC配置以及数据收发)

    本章实现了基于STM32F407MAC的数据收发功能,通过开发板的RJ45接口连接网线到电脑,电脑使用Wiershark工具抓包验证,工程源码.资料和软件见文末. 参考文档: DP83848IV英文 ...

  10. vue-helper 导致找到2个函数定义,跳转需要多点一下,禁用vue-helper即可

    vue-helper 导致找到2个函数定义,跳转需要多点一下,禁用vue-helper即可