字段、属性、索引器、常量

字段(成员变量)

什么是字段?

字段:是一种表示对象类型(类与结构体)关联的变量

字段是变量,即存储数据的,但是与局部变量不同

字段是类型的成员,旧称“成员变量”

实例字段:用来帮助实例存储字段,实例字段的组合表示了实例(对象)当前状态。

静态字段:表示类型(类与结构体)的状态,使用static修饰。

 描述某个学生的年龄,成绩就是实例字段。描述学生类型中的对象总数,是静态字段

namespace ConsoleApp1
{
    
    class Student 
    {
        public int Age;//实例字段,描述一个学生对象
        public int Score;//实例字段

        public static int Amount;//静态字段,学生类型有多少个学生
        public static int Average_score;//静态字段
        public Student()
        {
            Student.Amount++;
        }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            Student student1 = new Student();
            student1.Age = 15;
            student1.Score = 60;
            
            Student student2 = new Student();
            student2.Age = 16;
            student2.Score = 90;

            Student student3 = new Student();
            student3.Age = 16;
            student3.Score = 70;
        }
    }
}

 字段的声明

字段声明出现再类体里面,而语句是在方法体内。不要混淆字段与语句。

字段的初始化:系统会给字段(成员变量)默认值。也可手动初始化,一是直接在字段上(赋值)初始化器,二是在构造函数中初始化(赋值)。推荐前者。

修饰字段的标识符有:

new
public
protected
internal

private
static
readonly(只读)
volatile

实例只读字段:一旦初始化值,就不能改

public readonly int ID;

静态只读字段

示例:

namespace ConsoleApp2
{
    struct Color
    { 
        public int Red; 
        public int Green;
        public int Blue;
    }

    class Brush
    {
        public static readonly Color c = new Color() { Red = 0, Green = 0, Blue = 0 };
    }

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

        }
    }
}

属性

什么是属性

属性(property)是一种用于访问对象或类型的特征的成员,特征反映了状态。

一杯霸王茶姬 对象温度特征为100度,则其就是很烫的状态

熊猫这个物种类型,总数特征只有几十,则其是物种稀少的状态

属性是字段的自然扩展

从命名上看,field更偏向于实例对象在内存中的布局,property更偏向于反映现实世界对象的特征:

对外:暴露数据,数据是可以存储在字段里的,也可以是动态计算出来的

对内:保护字段不被非法值”污染”

属性由Get/Set方法对进化而来(属性是C#特有)

Get/Set方法示例:

    class Student 
    {
        private int age;
        public int GetAge() 
        {
            return this.age;
        }

        public void SetAge(int value) 
        {
            if (value > 120 && value < 0)
            {
                this.age = value;
            }
            else 
            {
                throw new Exception("年龄值有误");
            }
        }
    }
}
 

属性示例:(简化Get/Set方法)

namespace ConsoleApp3
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Student student1 = new Student();
            student1.Age=39;
        }
    }
    class Student 
    {
        public int age;
        public int Age 
        {
            get { return this.age; }
            //value为上下文关键字,系统设定它为传进来的数据,不用声明
            set
            {
                if (value <= 120 && value >= 0)
                {
                    this.age = value;
                }
                else
                {
                    throw new Exception("年龄值有误");
                }
            }
        }        
    }
}

又一个”语法糖”——属性背后的秘密

编写简单,实际系统有相关复杂的操作。

属性的声明 ※(需复习)

set和get方法使用的变量是属性名,而不是字段名 

完整声明----后台(back)成员变量与访问器(注意使用code snippet和refactor工具) 

快捷键法 :输入propfull  tab两下。

简略声明----只有访问器(查看IL代码) 

快捷键法 :输入propfull  tab两下。

动态计算值的属性

注意实例属性和静态属性

 属性的名字一定是名词

只读属性一 只有getter没有setter

尽管语法上正确,几乎没有人使用”只写属性”,因为属性的主要目的是通过向外暴露数据而表示对象/类型的状态

属性与字段的关系

二般情况下,它们都用于表示实体(对象或类型)的状态

属性大多数情況下是字段的包装器(wrapper)

建议:永远使用属性(而不是字段)来暴露数据,即字段永远都是private或protected的

索引器 

索引器是这样的一种成员:它使对象能与数组一样进行索引

indexer再tab两下,快捷生成。

在C#中,索引器是一种特殊的属性,它允许我们将数组、集合或其他自定义类型的元素通过类似于数组的方式访问,无需指定下标变量。通常,索引器会使用两个参数,一个用于获取元素(读索引器),另一个用于设置元素(写索引器)。例如,你可以使用myList[index] = value这样的语法来操作列表,这里的index就是索引器。索引器提供了一种更加方便和直观的方式来访问数据,增强了程序的灵活性。

C#中的索引器通常是通过this[]关键字声明的,并且需要实现getset访问器方法。比如:

public class MyCustomClass
{
    private List<int> _values;

    // 索引器的声明和读取部分
    public int this[int index]
    {
        get { return _values[index]; }
    }

    // 索引器的写入部分
    public void this[int index] = value
    {
        _values[index] = value;
    }
}

 常量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值