首页 > 编程语言 >C#学习笔记-字段、属性、索引器

C#学习笔记-字段、属性、索引器

时间:2024-05-01 12:11:07浏览次数:26  
标签:常量 C# value 索引 字段 Student new public 属性

字段

  字段表示与对象或者类型(类或结构体)关联的变量(成员变量),为对象或类型存储数据。与对象关联的字段称为“实例字段”,隶属于某个对象。与类型关联的字段称为“静态字段”,表示某一个类型当前的状态。

  静态字段使用 static 关键字修饰。字段在没有显示初始化的情况下会获得其类型的默认值,静态字段在类型被加载时初始化,当一个数据类型被运行环境加载的时候,其静态构造器会被调用且只被调用一次。实例字段在对象创建是被初始化。

class Student
{
    static public int number; //静态字段

    private int id;           //实例字段
    private string name;
    private int age;

    public Student()          //实例构造器
    {
        name = "null";
    }

    static Student()          //静态构造器
    {
        number = 0;
    }
}

Console.WriteLine(Student.number);

 属性

  属性用于访问对象或类型的特征的类成员。属性大多数情况下是字段的包装器,由Get/Set方法对发展而来,实际上是一个语法糖。与字段不同的是,属性不表示存储位置。

  属性和字段一般情况下都用来表示实体(对象或类型)的状态,更好的选择是使用属性来供外界访问字段,字段使用 private 或 protected 修饰。

class Student
{
    private int age;  //字段

    public int Age    //属性
    {
        get { return this.age; }
        set
        {
            if(value < 0 || value > 120) {
                throw new Exception("Age value has Error!");
            }
            this.age = value;  //返回 age 而不是 Age,否则会造成栈溢出
        }
    }
    
    public int Score { get; set; } //属性的简略声明,功能上和公有字段一样,不受保护,一般用于传递数据
}

Student stu = new Student();
stu.Age = 20;
Console.WriteLine(stu.Age);

索引

  索引器使对象能够用和数组相同的方式(使用下标)进行索引。

class Student
{
    private Dictionary<string, int> scoreDictionary = new Dictionary<string, int>();


    public int? this[string subject]
    {
        get {
            if (this.scoreDictionary.ContainsKey(subject))
            {
                return this.scoreDictionary[subject];
            }
            else return null;   
        }
        set {
            //获取索引对应的值可以为空,但是设置时的值不能为空
            if (value.HasValue == false)
            {
                throw new Exception("Score can't be null!");
            }
            if (this.scoreDictionary.ContainsKey(subject)){
                this.scoreDictionary[subject] = value.Value;
            }
            else
            {
                this.scoreDictionary.Add(subject, value.Value);
            }
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        Student stu = new Student();

        Console.WriteLine(stu["Math"]);

        stu["Math"] = 90;

        Console.WriteLine(stu["Math"]);
    }
}

常量

  成员常量是表示常量值的类成员,在编译时将常量标识符替换为对应的值,以提高程序运行时的效率。成员常量隶属于类型而不是对象,没有实例常量。“实例常量”的效果可以由只读字段来实现。“只读”的应用场景:

  1、提高程序可读性和执行效率--常量

  2、防止对象的值被改变--只读字段

  3、向外暴露不允许修改的值--只读属性(静态或非静态),静态只读属性和常量在功能上类似,但是编译器对二者的处理不同。

  4、希望成为常量的值其类型不能被常量声明接受时(类/自定义结构体)--静态只读字段

class Web
{
    public const Building Location = new Building() { Address = "Address"}; //invalid
    public static readonly Building Location = new Building() { Address = "Address" }; //valid
}

class Building
{
    public string Address {  get; set; }
}

 

标签:常量,C#,value,索引,字段,Student,new,public,属性
From: https://www.cnblogs.com/owmt/p/18113881

相关文章

  • Codeforces Round 942 Div.2 题解
    蹭个热度,挽救一下cnblogs蒸蒸日上的阅读量。Q:你是手速狗吗?A:我觉得我是。2A因为选的\(w\)一定可以让它合法,一次操作可以看作\(a\)数组向右平移一位。枚举操作次数后暴力判断即可。#include<bits/stdc++.h>voidwork(){ intn; std::cin>>n; std::vector<......
  • BSP视频教程第30期:UDS ISO14229统一诊断服务CAN总线专题,常用诊断执行流程精讲,干货分享
    视频教程汇总帖:https://www.armbbs.cn/forum.php?mod=viewthread&tid=110519 【前言】1、继前面分享了CANopen和J1939的专题后,这次继续为大家分享UDS专题视频第1期。2、统一诊断服务(UnifiedDiagnosticServices,简称UDS)是车用电子的通信协议,是电子控制器ECU中设备诊断用的网......
  • xhs全参xs,xt,xscommon逆向分析
    声明本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!目标网站aHR0cHM6Ly93d3cueGlhb2hvbmdzaHUuY29tL2V4cGxvcmUvNjYyNDcxYzkwMDAwMDAwMDA0MDE5ZGYwTrace[x......
  • Reverse Card (Hard Version)
    事情是这样的,我验了这一场CF。显然我玩原神玩多了有一个很奇怪的、不能过的算法,哦,当然,在我本机可以过。为了展现自己的智慧糖,我写一下。出题人是先发给我了一个限制都是\(n\)的,因此只有这个。\(n,m\)改改就是了。要求\(1\lea\len,1\leb\len\)满足\(a+b\midb\times......
  • IDEA在运行maven打war的时候报错:Cannot access defaults field of Properties
    问题描述:解决方案在pom.xml文件中引入:<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId>......
  • 在身份认证后建立用户对象ICurrentUser
    app.UseAuthentication();这个中间件添加后,他会为HttpContext.User设置一个ClaimsPrincipal对象。里面有身份认证token里面携带的信息。其访问方式如下HttpContext.User.FindFirstValue("自定义字段")我们可以创建一个服务,方便在应用中使用用户信息。因为在服务中拿不到Htt......
  • CMake极速入门
    引言还在手写晦涩难懂的Makefile文件吗?现如今,主流的c++项目都采取CMake作为项目构建工具,CMake可以跨平台运行,而且语法相对Makefile而言直观很多,是时候将Makefile扫进垃圾堆了。Hello,World!首先先以单个源文件项目为讲解,新建一个main.cpp文件:#include<iostream>usingnames......
  • leetcode算法热题--盛最多水的容器
    题目给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i,0)和(i,height[i])。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。示例1:输入:[1,8,6,2,5,4,8,3,7]输出:49解释......
  • 【Qt之JSON文件】QJsonDocument、QJsonObject、QJsonArray等类介绍及使用
    简述Qt5中包含了处理JSON的类,均以QJson开头(例如:QJsonDocument、QJsonArray、QJsonObject),在QtCore模块中,不需要额外引入其它模块。简述常用的JSON库JSON常用类简单的JSON对象简单的JSON数组复杂的JSON更多参考 常用的JSON库json.org 中介绍了......
  • [MRCTF2020]套娃
    [MRCTF2020]套娃打开环境发现有张图片显示不出来查看网页源代码发现部分代码$query=$_SERVER['QUERY_STRING'];if(substr_count($query,'_')!==0||substr_count($query,'%5f')!=0){die('Y0uareSocutE!');}if($_GET['b_u_p_t�......