• 【从头构筑C#知识体系】1.5 属性


    【系列文章目录】



    前言

    本篇介绍属性

    【C#文档——属性】


    一、什么是属性

    1.文档中的描述

    还是照常先看来自官方的描述

    • 属性是 C# 中的一等公民。 借助该语言所定义的语法,开发人员能够编写出准确表达其设计意图的代码。

    • 访问属性时,其行为类似于字段。 但与字段不同的是,属性通过访问器实现;访问器用于定义访问属性或为属性赋值时执行的语句。

    有点看不懂,那就继续看看官方的例子吧

    属性语法是字段的自然延伸。 字段定义存储位置:

    public class Person
    {
    	public string FirstName;
    	// remaining implementation removed from listing
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    属性定义包含 get 和 set 访问器的声明,这两个访问器用于检索该属性的值以及对其赋值:

    public class Person
    {
    	public string FirstName { get; set; }
    	// remaining implementation removed from listing
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    上述语法是自动属性语法。 编译器生成支持该属性的字段的存储位置。
    编译器还实现 get 和 set 访问器的正文。

    这样看就清楚了,对于字段和属性是有区别的

    字段就是正常我们定义变量的方式

    而属性需要有访问器即getset

    getset分别对应了一个对应属性类型返回值的函数

    但是这样有什么好处或者说有什么意义呢?感觉好像都是定义了一个变量

    2.我的理解

    我认为属性相比字段的好处是

    • 隔离类的内部变化,让外部不受影响
    • 外部获取属性时,会按照一定的流程得出想要的结果

    举个例子吧

    public class Person
    {     
        public int Age      
        {         
            get          
            {      
            	//今年减去出生年得出年龄   
                return DateTime.Now.Year - BirthYear;         
            }    
        }        
        
        //出生年
        public int BirthYear; 
    }  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    当然如果只是为了功能,以下写法也可以实现

    public class Person{
     	public int GetAge() 
        {         
    		//今年减去出生年得出年龄   
    		return DateTime.Now.Year - BirthYear;            
        }        
        
        //出生年
    	public int BirthYear;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    但是这样就好像怪怪的,年龄明明应该是一个属性,却用了一个方法来获取

    那么在C#中
    什么时候该使用属性?
    什么时候使用字段什么?
    时候使用方法呢??

    按照我的理解:

    • 字段应该尽量为私有(private)或保护(protected)
    • 公共字段应该尽量改为使用属性(即使不需要验证流程)
    • 当执行一个行为,或者需要传入参数来得出一个变量时使用方法

    二、没什么用的冷知识

    C# 1.0 中的属性,不能简写为

    public string FirstName { get; set; }
    
    • 1

    而这样定义

    private string mFirstName; 
    
    public string FirstName
    {     
        get { return mFirstName; }     
        set { mFirstName = value; }
    }  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    也就是简写方式实际上是一种语法糖

    属性真正的运作方式是C#1.0中那样的


  • 相关阅读:
    游戏合作伙伴专题:BreederDAO 与 Ultiverse 建立了一个新的元宇宙
    机器学习-------数据标准化
    【云手机】数据安全如何保障?
    三年测试经验, 字节跳动离职后, 一口气拿到 15 家公司 Offer
    千人虚拟社交体验,多人元宇宙场景真的可行么?
    Codeforces Round #811 (Div. 3)
    客户收到报价后突然安静了,怎么办?
    图文详解MapReduce工作机制
    131. SAP UI5 Cross Application Navigation (跨应用间跳转)的本地模拟实现
    【数据库系统概论】第一章数据库绪论
  • 原文地址:https://blog.csdn.net/ruanlinxi1994/article/details/125457907