C#属性介绍

2024-01-04

一、简要介绍

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

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;
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#属性介绍 的相关文章

随机推荐

  • 视频转文字怎么弄?这几个方法让你事半功倍

    这个学期上网课上到人都傻了 谁能懂我的痛啊 你有没有试过一边听网课一边写笔记 结果手速跟不上 导致笔记记得不完整 而且手上写出来的字还跟狗爬一样 更郁闷的是 有时候一个短短十分钟的视频 要花上半个小时 甚至更久去记录下重点内容 这怎么行啊
  • prometheus基本介绍

    官网 https prometheus io docs introduction overview 中文 https www prometheus wang Prometheus 选择 Prometheus 并不是偶然 因为 Prometh
  • 国家信息安全水平等级考试NISP二级题目卷④(包含答案)

    国家信息安全水平等级考试NISP二级题目卷 四 国家信息安全水平等级考试NISP二级题目卷 四 需要报考咨询可以私信博主 前言 国家信息安全水平考试 NISP 二级 被称为校园版 CISP 由中国信息安全测评中心发证 NISP运营管理中心
  • 3 分钟为英语学习神器 Anki 部署一个专属同步服务器

    Anki 介绍 Anki 是一款基于间隔重复 Spaced Repetition 原理的学习软件 想象一下 你的大脑就像是一个需要定期维护的精密仪器 间隔重复就好比是一种精准的维护计划 它通过在最佳时刻复习信息 来确保知识在你的脑海中牢固地
  • SimGNN:A Neural Network Approach to Fast Graph Similarity Computation

    Part 1 论文阅读 论文链接 SimGNN A Neural Network Approachto Fast Graph Similarity Computation 1 摘要 图相似性搜索 是最重要的基于图的应用程序之一 例如查找与查
  • 这套Go语言开发框架组合真的非常高效

    我尝试过很多框架 从Django Flask和Laravel到NextJS和SvelteKit 到目前为止 这是我唯一可以使用的不会让我感到疯狂或者放弃项目的堆栈 框架 我喜欢所有这些框架 但我只是不太适应它们的设计方式 实际上 我是一个弱
  • xCell -- Cell Type Enrichment Analysis

    目的 希望得知TCGA的每个癌种中 T cell占比分布 或者说哪种肿瘤T cell在所有细胞中占比多 浸润的多 热肿瘤 输入数据 gene expression matrix HUGO gene symbols as row names
  • 当设置display:inline;时,盒模型的宽度样式失效的解决办法

    当给一个盒子的样式加了 box display inline 后 发现宽度就失效了 但是有需要盒子不换行 把display inline 删了 换成float left 效果是一样的
  • 有趣的数学 为什么素数在密码学中很重要?

    这里我们将探讨为什么素数在密码学中很重要 我们将根据特定的密码系统 RSA 算法 来进行深入了解 一 素数的特殊性 每个数字都可以分解为它的素数 一般来说 找到一个数的因数是非常困难的 要找到一个自然数的所有素因数 必须尝试将其除以它的可能
  • VGA光端机技术白皮书:传统与现代的桥梁

    在数字化时代的潮流中 VGA光端机 技术作为传统与现代的桥梁 展现出了其独特的价值和重要性 VGA光端机主要用于远距离传输模拟视频信号 它不仅在传统领域中发挥着重要作用 同时也在与现代技术的结合中展现出新的活力 技术特点 高兼容性 VGA接
  • 高管换防,年度销量缺口较大,朱华荣掌舵的阿维塔前路在何方?

    高管换防下 阿维塔的压力依然不小 阿维塔前任CEO谭本宏曾将汽车行业的角逐比喻为一场全程马拉松 有的人开始跑的很快 结果跑到15公里就被迫下场 就是因为节奏和动作变形 在他看来 设立合理的目标与发展节奏 考验着品牌把握竞争与压力的能力 而纵
  • 视频直播技术干货(十一):超低延时视频直播技术的演进之路

    本文由字节跳动技术团队李晨光 匡建鑫 陈鉴平分享 本文有修订和改动 1 引言 新媒体互动直播已成为了广大网民最重要的休闲娱乐方式之一 丰富的传统文化 新闻 竞技体育 法律 知识共享等内容 通过移动端互动直播的形式得以更加高效的展现传播 既让
  • 数据光端机技术进展:高速数据通信的未来

    数据光端机技术进展 高速数据通信的未来 在信息技术迅猛发展的今天 数据光端机 已站在高速数据通信的前沿 它不仅象征着通信技术的飞跃 还为海量数据的迅速传递铺平了道路 核心特征 超高速的传输效率 数据光端机利用尖端光纤技术 实现了前所未有的数
  • 音频翻译文字软件哪个好用?猜你在找这几个翻译工具

    随着跨语言交流的深入发展 音频翻译技术的应用也越来越广泛 有了这项技术 大家可以在各个领域中快速实现跨语言的交流和理解 进一步实现跨语言的即时沟通 而随着这项技术的不断发展 音频翻译的准确率和实时性也在不断提高 许多应用有这项技术的翻译工具
  • prometheus grafana nginx 安装配置和使用

    文章目录 前传 prometheus exporter容器 监控nginx nginx需要加载stub status监控 查看有没有 如果有 去配置下nginx 重要 需要重启nginx 测试监控是否成功 prome
  • 字符串处理-第11届蓝桥杯省赛Python真题精选

    导读 超平老师的Scratch蓝桥杯真题解读系列在推出之后 受到了广大老师和家长的好评 非常感谢各位的认可和厚爱 作为回馈 超平老师计划推出 Python 蓝桥杯真题解析100讲 这是解读系列的第26讲 字符串处理 本题是2020年6月20
  • css 文字闪烁

    flicker color dd4814 animation masked animation 1 5s linear infinite webkit animation masked animation 1 5s linear infin
  • 新导物联rfid人员定位管理系统

    rfid人员定位管理系统是一个智能化的人员定位导航和监控系统 它具备数据信息收集 精确查询 统计分析等功能 rfid人员定位管理系统 包含了人员信息数据搜集 统计分析和管理方法三个层面的内容 在人员信息数据收集层面 可以实现不同单位 不同身
  • 欢迎来到阿清的数据分析求职分享

    大家好 我是阿清 在这里 我将与大家分享关于数据分析岗位求职路上的点点滴滴 包括行业和岗位的深入见解 求职技巧 面试准备方法 以及实战案例分析等等 关于我 正经工作履历 2015年东南大学计算机专业研究生毕业 校招身份加入了阿里 最初参与面
  • C#属性介绍

    文章目录 一 简要介绍 二 详细介绍 2 1 例子 2 2 属性和字段的比较 2 3 自动实现属性 2 4 静态属性 2 5 只读 只写属性 2 6 属性可访问性