C#知识点(7)属性、索引器

属性(Property)

属性的概念

  1. 字段:是在类或结构中直接声明的任意类型的变量。
  2. 属性:使用访问器(accessors)读取或者操作字段,本身是不保存任何数据的。
  3. 属性出现的范围:类(class)、结构(structure)和接口(interface)。
  4. 本质上:属性其实也是方法,不过是用来读取操作字段的,反编译就可以看到set和get其实是方法。

访问器

  1. 访问器(accessors):包含助于获取(读取或者计算)或设置(写入)属性的可执行语句。
  2. 分类:get访问器、set访问器。

属性声明和使用的演示

声明:分为自动属性语法和自定义存储,使用 get 和 set 访问器来定义属性。
使用:用“.属性名字”当成字段读取和赋值就行了。

  • 自动属性语法
namespace Blog1
{
    class Program
    {
        public class Person
        {
            //自动属性语法
            public string Name
            {
                get;
                set;
            }
        }
        static void Main(string[] args)
        {
            Person person = new Person();
            //属性使用,“.属性名字”当成字段读取和赋值就行了
            person.Name = "小明";
            Console.WriteLine(person.Name);
            Console.ReadKey();
        }
    }
}
/*输出:
小明
*/
  • 自行定义存储
    注意:需要先定义一个字段,命名规则一般为字段首字母小写,属性则大写。
    public class Person
    {
        //需要先定义一个字段,命名规则一般为字段首字母小写,属性则大写
        private string name;
        //自定义存储
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                if (value != null)
                {
                    name = value;
                }
                else
                {
                    name = "某某";
                }
            }
        }
    }

抽象属性

    public abstract class Person
    {
        public abstract string Name
        {
            get;
            set;
        }
    }
    public class Student : Person
    {
        private string name;
        public override string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = (value==null)?"某某":value;
            }
        }
    }

接口属性

    interface ITalk
    {
        string Talk
        {
            get;
            set;
        }
    }
    public class Student : ITalk
    {
        private string talk;
        public string Talk
        {
            get
            {
                return talk;
            }
            set
            {
                talk = (value==null)?"C#不错!":value;
            }
        }
    }

索引器(Indexer)

索引器使用

  1. 索引器:允许一个对象可以像数组一样被所有。让被定义为索引器的类,可以像数组一样通过运算符“[ ]”来访问该类的实例。
  2. 索引器声明:类似于属性,使用 get 和 set 访问器来定义索引器。
namespace Blog1
{
    public class Student
    {
        //学生课程分数对应关系
        private Dictionary<string, float> DirCrouses=new Dictionary<string, float >();
        public float this[string courseName]
        {
            get
            {
                if(this.DirCrouses.ContainsKey(courseName))
                    return DirCrouses[courseName];
                else 
                    return 0;
            }
            set
            {
                //分数输入在不在范围内
                if (value < 0 || value > 100)
                {
                    throw new Exception("Score out of range");
                }
                if (this.DirCrouses.ContainsKey(courseName))
                {
                    this.DirCrouses[courseName] = value;
                }
                else
                {
                    this.DirCrouses.Add(courseName, value);
                }
            }
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            Student student = new Student();
            student["Math"] = 90;
            student["Chinese"] = 100;
            Console.WriteLine(student["Chinese"]);
            Console.ReadKey();
        }
    }
}
/*输出:
100
*/

重载索引器

public class Student
{
    //学生课程分数对应关系
    private Dictionary<string, float> DirCrouses = new Dictionary<string, float>();
    //学生每个年纪的学历
    private string[] education = new string[250];
    public float this[string courseName]
    {
        get
        {
            if (this.DirCrouses.ContainsKey(courseName))
                return DirCrouses[courseName];
            else
                return 0;
        }
        set
        {
            if (value < 0 || value > 100)
            {
                throw new Exception("Score out of range");
            }
            if (this.DirCrouses.ContainsKey(courseName))
            {
                this.DirCrouses[courseName] = value;
            }
            else
            {
                this.DirCrouses.Add(courseName, value);
            }
        }
    }
    //重载
    public string this[int age]
    {
        get
        {
            return this.education[age];
        }
        set
        {
            this.education[age] = value;
        }
    }
}

属性和索引器的同异

同:

  • 索引器是属性的一种,所以它实质上也是方法(函数),都不用分配内存来存储。
  • 主要都是用来访问其它数据成员,为它们提供读取和操作。

异:

  • 属性名可以自定义,索引器必须以this命名。
  • 属性可以是实例或静态,而索引器必须是实例。
  • 索引器可以被重载,属性不行。
  • 属性的get访问器没有参数,索引器的get访问器具有和索引器相同的形参表。
  • 属性的set访问器包含隐藏value参数,索引器的set访问器除了value参数外,还具有和索引器相同的形参表。
  • 属性通过简单名称访问,索引器通过索引访问。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中,可以使用索引来实现使用属性名称获取属性对象。下面是一个示例: ```csharp using System; using System.Collections.Generic; class MyClass { private Dictionary<string, object> properties = new Dictionary<string, object>(); public object this[string propertyName] { get { if (properties.ContainsKey(propertyName)) { return properties[propertyName]; } else { throw new ArgumentException("Invalid property name"); } } set { properties[propertyName] = value; } } } class Program { static void Main(string[] args) { MyClass myObject = new MyClass(); myObject["Name"] = "John"; myObject["Age"] = 30; Console.WriteLine("Name: {0}", myObject["Name"]); Console.WriteLine("Age: {0}", myObject["Age"]); } } ``` 在上面的示例中,`MyClass`类包含一个名为`properties`的字典,它将属性名作为键,属性值作为值。然后,`MyClass`类实现了一个名为`this`的索引,它接受一个字符串参数,该参数作为属性名称。在索引的`get`方法中,它检查`properties`字典中是否存在该属性,并返回该属性的值。在索引的`set`方法中,它将该属性的值设置为提供的值。在`Main`方法中,我们使用索引来设置和获取`Name`和`Age`属性的值。 需要注意的是,这种实现方式存在一些潜在的问题。例如,如果属性名称拼写错误,则会引发`ArgumentException`异常。此外,索引可能会返回任何类型的属性值,因此需要进行类型检查。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值