深入理解C#属性和索引器的使用与实现

背景简介

在C#编程语言中,属性和索引器是两个极为重要的特性,它们在面向对象编程中扮演着关键角色。通过本章内容,我们将深入了解这些特性的工作原理、如何实现以及它们在实际开发中的应用。

属性的使用与实现

属性是类或结构体中用于封装字段的成员,它们对外提供了字段的读写能力,但可以控制对字段的访问和修改。属性的声明包括get和set访问器,分别用于获取和设置属性值。

this引用的使用

this 关键字用于区分类的字段和方法参数。例如,在构造函数中, this.name 引用类的字段,而 name 可能是一个参数。

public class Test 
{
   string name; 
   public Test (string name) => this.name = name; 
}

this 引用仅在类或结构体的非静态成员中有效。

属性的声明与访问

属性的声明类似于字段,但包括get和set访问器。这允许开发者在属性值被读取或修改时执行额外的逻辑,例如数据验证或转换。

public class Stock 
{
   decimal currentPrice;          

   public decimal CurrentPrice      
   { 
     get { return currentPrice; } 
     set { currentPrice = value; } 
   }
}

get访问器在属性被读取时执行,必须返回属性类型的值;set访问器在属性被赋值时执行,拥有一个名为value的隐式参数。

只读和计算属性

属性可以是只读或只写的。只读属性只有get访问器,而只写属性只有set访问器。例如, Worth 属性是只读的,因为它从其他字段计算得出:

public decimal Worth => currentPrice * sharesOwned;
表达式体属性与自动属性

C#允许使用表达式体属性以更简洁的方式声明只读属性。自动属性是一种更常见的实现,编译器会自动生成私有字段。

索引器的使用与实现

索引器提供了一种访问类或结构中集合数据的方式,类似于数组或字典。

实现索引器

索引器允许通过索引访问数据,可以有多个,并且可以接受不同类型的参数。

class Sentence 
{
   string[] words = "The quick brown fox".Split(); 

   public string this [int wordNum]       
   { 
     get { return words [wordNum]; }   
     set { words [wordNum] = value; } 
   } 
}
索引器的CLR实现

索引器在内部编译成名为 get_Item set_Item 的方法。这表明索引器和属性在底层实现上都是通过方法来实现的。

总结与启发

通过本章的学习,我们认识到了属性和索引器在C#编程中的重要性。它们不仅增强了代码的封装性,还提供了更细粒度的控制,使得数据访问更加安全和灵活。属性和索引器的实现机制表明了C#语言设计的深思熟虑,同时也为开发者提供了强大的工具来构建健壮、可维护的应用程序。了解这些概念,对于任何希望深入C#编程的开发者来说,都是不可或缺的。

在未来开发过程中,我们应该尽量利用属性代替公共字段,以促进封装,保护数据不被外部直接访问。同时,要合理使用索引器,以提供直观的方式来访问和操作复杂数据结构。对于新引入的C# 9特性如init-only属性,我们要保持关注,并评估在适当场景下应用,以增强类型安全性。

你可能感兴趣的:(C#属性,索引器,get和set访问器,封装,CLR实现)