C# 字段 属性 索引器

  • 字段
    • 声明字段
    • 字段初始化
    • 静态字段
    • 常量字段
    • 只读字段
    • 字段的访问
    • 然而
  • 属性
    • 声明属性
    • 自动实现的属性
    • 只读属性
    • 只写属性
    • 属性的逻辑处理
    • 属性的访问修饰符
    • 属性和字段的区别
    • 属性的用途
    • 总结
  • 索引器
    • 索引器的基本语法
    • 使用索引器
    • 索引器的关键点
      • 语法
      • 参数
      • 访问和设置
      • 异常处理
      • 性能
      • 重载
      • 使用场景
      • 封装
      • 再举个例子
    • 总结

字段

众嗦粥汁,字段又叫成员变量
C#中,字段(Fields)是类的成员,用于存储数据。字段可以是任何数据类型,包括基本数据类型(如 int, double, bool 等)和引用类型(如类、数组等)。字段可以是静态的static(属于类的,而不是类的实例)或实例的(属于类的对象)。

以下是一些关于C#字段的关键点:

声明字段

字段是在类中声明的,并且可以有访问修饰符(如 public, private, protected, internal 等)来指定其可访问性。

public class Person
{
    public string Name; // 公共字段
    private int age;    // 私有字段
    protected bool isStudent; // 受保护的字段,只能在此类及其派生类中访问
}

字段初始化

字段可以在声明时初始化,也可以在构造函数中初始化。

public class Person
{
    public string Name = "Unknown"; // 字段初始化
    public int Age { get; set; } // 自动属性,具有默认值0

    public Person(string name, int age)
    {
        Name = name;
        Age = age; // 构造函数中初始化
    }
}

静态字段

静态字段属于类本身,而不是类的任何特定实例。它们使用 static 关键字声明。

public class School
{
    public static int StudentCount = 0; // 静态字段

    public School()
    {
        StudentCount++; // 增加学生计数
    }
}

常量字段

使用 const 关键字声明的字段是常量,它们的值在编译时已知,并且在运行时不能更改。

public class Constants
{
    public const double Pi = 3.14159; // 常量字段
}

只读字段

只读字段使用 readonly 关键字声明,它们可以在声明时或构造函数中初始化,但之后不能被修改。

public class Product
{
    public readonly string ProductCode; // 只读字段

    public Product(string code)
    {
        ProductCode = code;
    }
}

字段的访问

字段可以通过对象实例访问(对于实例字段)或直接通过类名访问(对于静态字段)。

Person person = new Person();
person.Name = "Alice"; // 访问实例字段

School.StudentCount = 10; // 访问静态字段

字段是类定义中最基本的数据存储单元,它们提供了一种简单的方式来存储和操作数据。

然而

为了封装和数据保护,通常建议使用属性(Properties)而不是直接访问字段。属性提供了一种更灵活的方式来控制对字段的访问,并且可以在访问或设置值时添加额外的逻辑。


属性

C#中,属性(Properties)是一种成员,它们提供了一种访问和设置字段值的方法,同时允许你添加逻辑来验证或处理这些值。属性可以被视为字段的替代品,但它们提供了更多的控制和灵活性。

属性通常包含两个部分:get 访问器和 set 访问器。get 访问器返回属性的值,而 set 访问器设置属性的值。属性可以是只读或只写,也可以是读写的。

以下是一些关于C#属性的关键点:

声明属性

属性使用 getset 块声明,它们定义了如何获取和设置属性值。

public class Person
{
    private string _name; // 私有字段,用于存储属性值

    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }
}

自动实现的属性

C# 允许你使用自动实现的属性,这样编译器会自动生成一个私有字段来存储属性的值。

public class Person
{
    public string Name { get; set; }
}

只读属性

如果只需要 get 访问器,属性可以是只读的。

public class Person
{
    public string Name { get; }
}

只写属性

如果只需要 set 访问器,属性可以是只写的。

public class Person
{
    private string _name;
    public string Name
    {
        set { _name = value; }
    }
}

属性的逻辑处理

可以在 set 访问器中添加逻辑,比如验证输入值。

public class Product
{
    private decimal _price;

    public decimal Price
    {
        get { return _price; }
        set
        {
            if (value < 0)
                throw new ArgumentOutOfRangeException("价格不能为负数。");
            _price = value;
        }
    }
}

属性的访问修饰符

属性的 getset 访问器可以有不同的访问修饰符,以控制它们的可见性。

public class Product
{
    public decimal Price
    {
        private get { return _price; }
        protected set { _price = value; }
    }
}

属性和字段的区别

属性允许你控制对数据的访问,而字段是直接的数据存储。属性通常用于封装字段,提供数据验证或逻辑处理。

属性的用途

属性通常用于封装数据,提供数据验证,以及实现数据绑定等。

总结

属性是C#中非常重要的特性,它们提供了一种安全和灵活的方式来访问和修改对象的状态。通过使用属性,你可以隐藏实现细节,同时提供对数据的控制。


索引器

C#中,索引器(Indexers)是一种特殊的属性,它允许你使用数组索引的语法来访问对象的元素。索引器可以有多个参数,这使得它们非常适合用来实现类似字典或数据库表的访问模式。

索引器的基本语法

public class MyClass
{
    private Dictionary<int, string> _data = new Dictionary<int, string>();

    // 索引器声明
    public string this[int index]
    {
        get
        {
            if (_data.TryGetValue(index, out string value))
                return value;
            else
                throw new KeyNotFoundException("索引未找到。");
        }
        set
        {
            _data[index] = value;
        }
    }
}

使用索引器

class Program
{
    static void Main()
    {
        MyClass myObj = new MyClass();

        // 使用索引器设置元素
        myObj[1] = "Hello";
        myObj[2] = "World";

        // 使用索引器获取元素
        Console.WriteLine(myObj[1]); // 输出: Hello
        Console.WriteLine(myObj[2]); // 输出: World

        try
        {
            // 尝试访问不存在的索引
            Console.WriteLine(myObj[3]);
        }
        catch (KeyNotFoundException ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

索引器的关键点

语法

索引器的语法与属性类似,但使用了 this 关键字,后面跟着参数列表。

参数

索引器可以有一个或多个参数,这些参数用于确定要访问或设置的元素。

访问和设置

索引器可以有 getset 访问器,允许你获取和设置元素的值。

异常处理

get 访问器中,如果尝试访问不存在的索引,可以抛出异常,如 KeyNotFoundException

性能

使用索引器可以提供快速的数据访问,特别是当你使用内部数据结构(如字典)来存储元素时。

重载

你可以为同一个类定义多个索引器,只要它们的参数列表不同。

使用场景

索引器非常适合实现类似数组或字典的数据结构,允许用户通过索引来访问和修改数据。

封装

索引器可以封装内部数据结构,隐藏实现细节,只暴露必要的接口给用户。

再举个例子

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace forCode2019 {
    class Program {
        static void Main(string[] args) {

            Demo d = new Demo(3);
            d[2] = 1;
            d[1] = d[2] * 5;
            d[0, 1] = 100;
            Console.WriteLine(d[1]);
            Console.ReadKey();

        }
    }

    class Demo {
        int[] a;
        public Demo(int size) {
            a = new int[size];
        }
        public int this[int index] {
            get {
                return a[index];
            }
            set {
                a[index] = value;
            }
        }
        public int this[int x, int y] {
            get {
                return a[x+y];
            }
            set {
                a[x+y] = value;
            }
        }
    }
}

总结

索引器是C#中一个强大的特性,它提供了一种自然和直观的方式来访问和操作对象的元素。通过使用索引器,你可以创建更加灵活和强大的数据结构。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Matlab|基于手肘法的kmeans聚类数的精确识别【K-means聚类】

主要内容 在电力系统调度研究过程中&#xff0c;由于全年涉及的风、光和负荷曲线较多&#xff0c;为了分析出典型场景&#xff0c;很多时候就用到聚类算法&#xff0c;而K-means聚类就是常用到聚类算法&#xff0c;但是对于K-means聚类算法&#xff0c;需要自行指定分类数&…

Google Earth Engine(GEE)——计算闪闪红星的ndvi的值和折线图(时序分析)

函数: ui.Chart.image.doySeries(imageCollection, region, regionReducer, scale, yearReducer, startDay, endDay)

中小学电子教材下载办法(202406最简单的)

官方版本 现在能阅读电子教材的官方网站挺多的&#xff0c;例如 人民教育出版社-电子教材&#xff0c;还有 国家中小学智慧教育平台 &#xff0c;其他还有很多可在阅读的网站。由于平台的原因不能直接贴链接&#xff0c;大家可以通过搜索关键词找到网站。 如何下载 据我所知…

idea搜索只显示100条、如何修改idea搜索的条数

文章目录 一、老版本的IDEA&#xff08;2021年之前的版本&#xff09;二、新版本的IDEA&#xff08;2021年及之后的版本&#xff09;2.1、方式一2.2、方式二 如下图&#xff1a;idea搜索的时候默认只显示100条 要解决IDEA搜索只显示100条的问题&#xff0c;可以通过修改搜索结…

【推荐】Perl入门教程特点功能文本处理读取文件替换文本写入文件分割字符数据库处理环境准备安装(包含示咧)

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

HashMap详解(含动画演示)

目录 HashMap1、HashMap的继承体系2、HashMap底层数据结构3、HashMap的构造函数①、无参构造②、有参构造1 和 有参构造2 (可以自定义初始容量和负载因子)③、有参构造3(接受一个Map参数)JDK 8之前版本的哈希方法&#xff1a;JDK 8版本的哈希方法 4、拉链法解决哈希冲突什么是拉…

监控室,屏幕显示不支持码流

1号屏&#xff0c;出现不支持码流 如下原因 老是录像机 无法关闭自动添加摄像头功能&#xff0c; 其他杂牌摄像头 会自动还ip 最终导致 ip冲突 更换ip 可以解决

Arnoldi Iteration 思考

文章目录 1. 投影平面2. Arnoldi Iteration3. python 代码 1. 投影平面 假设我们有一个向量q,我们需要关于向量q&#xff0c;构建一个投影平面P&#xff0c;使得给定任何向量v,可以通过公式 p P v pPv pPv&#xff0c;快速得到向量v在投影平面P上的投影向量p. 计算向量内积,…

部署LVS-DR群集...

目录 最后一台主机&#xff08;第四台&#xff09; 本地yum源安装httpd&#xff08;非必做&#xff09; 继续开始从最后一台主机开始&#xff08;第四台&#xff09; 转第二台主机 转第三台主机 回第二台 上传 转第三台主机 上传 回第二台 转第三台 转第一台主机…

Parallelize your massive SHAP computations with MLlib and PySpark

https://medium.com/towards-data-science/parallelize-your-massive-shap-computations-with-mllib-and-pyspark-b00accc8667c (能翻墙直接看原文&#xff09; A stepwise guide for efficiently explaining your models using SHAP. Photo by Pietro Jeng on Unsplash Int…

前端:鼠标点击实现高亮特效

一、实现思路 获取鼠标点击位置 通过鼠标点击位置设置高亮裁剪动画 二、效果展示 三、按钮组件代码 <template><buttonclass"blueBut"click"clickHandler":style"{backgroundColor: clickBut ? rgb(31, 67, 117) : rgb(128, 128, 128),…

docker login 报错: http: server gave HTTP response to HTTPS client

环境&#xff1a; 自建 Harbor、Docker 1. 问题分析 # 命令&#xff0c;这里用的是 IP&#xff0c;可以为域名 docker login -u test 172.16.51.182:31120 # 输入密码 Password:# 报错如下&#xff1a; Error response from daemon: Get "https://172.16.51.182:31120/…

[DDR4] DDR 简史

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解DDR4》 存和硬盘&#xff0c;这对电脑的左膀右臂&#xff0c;共同扛起了存储的重任。内存以其超凡的存取速度闻名&#xff0c;但一旦断电&#xff0c;内存中的数据也会消失。它就像我们的工作桌面&…

基于WPF技术的换热站智能监控系统14--搭建西门子PLC通信环境

1、安装博途软件V15 本项目需要用到西门子PLC&#xff0c;系统所需的数据来自现场PLC实时采集的数据&#xff0c;所以需要配置PLC的通信环境&#xff0c;具体请看以下博客文章。 windows10企业版安装西门子博途V15---01准备环境_博途v15.1安装需求-CSDN博客 windows10企业…

5.Sentinel入门与使用

5.Sentinel入门与使用 1.什么是 Sentinel?Sentinel 主要有以下几个功能: 2.为什么需要 Sentinel?3.Sentinel 基本概念3.1 什么是流量控制?3.1.1 常见流量控制算法3.1.2 Sentinel 流量控制流控效果介绍如下: 3.2 什么是熔断?熔断策略 3.3 Sentinel 组成&#xff08;资源和规…

[vue3]组件通信

自定义属性 父组件中给子组件绑定属性, 传递数据给子组件, 子组件通过props选项接收数据 props传递的数据, 在模版中可以直接使用{{ message }}, 在逻辑中使用props.message defineProps defineProps是编译器宏函数, 就是一个编译阶段的标识, 实际编译器解析时, 遇到后会进行…

【Oracle APEX开发小技巧1】转换类型实现显示小数点前的 0 以 及常见类型转换

在 apex 交互式式网格中&#xff0c;有一数值类型为 NUMBER&#xff0c;保留小数点后两位的项&#xff0c;在 展示时小数点前的 0 不显示。 效果如下&#xff1a; 转换前&#xff1a; m.WEIGHT_COEFFICIENT 解决方案&#xff1a; 将 NUMBER&#xff08;20&#xff0c;2&#xf…

模拟电子技术基础(一)--本证半导体与杂质半导体

半导体分为两大类&#xff1a;本征半导体和杂质半导体。这两种类型的半导体在电子结构和电导特性上有显著的区别。 本征半导体&#xff08;Intrinsic Semiconductor&#xff09; 定义和组成&#xff1a;本征半导体是纯净的半导体&#xff0c;没有任何杂质原子。最常见的本征半…

2023年13个最适合销售电子书的WordPress主题

欢迎来到我们用于销售电子书和其他数字/可下载产品&#xff08;软件、应用程序、图标集、主题等&#xff09;的最佳WordPress主题的完整集合。 这些主题有内置的支付网关&#xff0c;可以通过 PayPal、信用卡等处理安全支付。&#xff08;易于配置&#xff01;&#xff09; 最…

Python轮子:Excel读写利器——openpyxl

原文链接&#xff1a;http://www.juzicode.com/python-module-openpyxl 在之前的xlwt和xlrd的文章中我们介绍了Excel访问的2个工具&#xff0c;它们分别只能对Excel文件进行写或者读&#xff0c;今天再介绍一个可以对Excel进行读和写的工具——openpyxl。需要注意的是openpyxl…