1. 属性
いわゆる属性は、実際には、プライベート クラス フィールドへの制御されたアクセスを実装する特別なクラス メンバーです。 C# 言語には 2 つの属性メソッドがあります。1 つはプライベート フィールドの値を返すことができる get で、もう 1 つはプライベート フィールドの値を設定できる set です。たとえば、学生の名前属性を作成し、名前フィールドへのアクセスを制御する例として次のコードを取り上げます。
using System; public class Student { private string name; /// <summary> /// 定义学生的姓名属性 /// </summary> public string Name { get { return name; } set { name = value; } } } class Program { static void Main(string[] args) { Student student = new Student(); student.Name = "Jeff Wong"; Console.WriteLine(student.Name); Console.Read(); } }
2. インデクサー
簡単に言うと、いわゆるインデクサーは特殊なタイプの属性であり、これを使用して、配列と同じように独自のクラスを参照できます。明らかに、この機能はコレクション クラスを作成する場合に特に便利ですが、大きなファイルの処理や特定の限られたリソースの抽象化など、他の状況でも、クラス内で配列のような動作を行うことももちろん非常に便利です。たとえば、上記の例では、クラスに複数の生徒がいると想定しています。インデクサーの構築は簡単に呼び出すことができます。
using System; using System.Collections.Generic; public class Student { public List<Student> listStudents = new List<Student>(); /// <summary> /// 构建索引器 /// </summary> /// <param name="i"></param> /// <returns></returns> public Student this[int i] { get { return listStudents[i]; } set { listStudents[i] = value; } } private string name; /// <summary> /// 属性 /// </summary> public string Name { get { return name; } set { name = value; } } public Student(string name) { this.name = name; } public Student() { this.listStudents.Add(new Student("jeff wong")); this.listStudents.Add(new Student("jeffery zhao")); this.listStudents.Add(new Student("terry lee")); this.listStudents.Add(new Student("dudu")); } } class Program { static void Main(string[] args) { Student student = new Student(); int num = student.listStudents.Count; Console.WriteLine("All the students:"); for (int i = 0; i < num; i++) { Console.WriteLine(student[i].Name); //通过索引器,取所有学生名 } //设置索引器的值 student[0].Name = "jeff"; Console.WriteLine("After modified,all the students:"); for (int i = 0; i < num; i++) { Console.WriteLine(student[i].Name); } Console.Read(); } }
上記のコードでは、インデクサーのアクセサーがパラメーターを受け取ることがわかります (パラメーターは実際、インデクサーは複数のパラメーターを使用して構築できます。上記のコードを例として、生徒の生徒番号と名前に基づいて生徒のテストの合計スコアを取得したいとします。変更されたコードは次のとおりです:
<1>、
定義。属性の:
{
set { ステートメントコレクション }
}
インデクサー定義:
アクセス修飾子の戻り値の型 this [パラメータタイプ パラメータ...]
{ get }}
e set {statement collection}
& & & lt; 2 & gt;
インデックスを同様のメソッドで配列に設定できるようにします。
このキーワードはインデクサーを定義するために使用されます。
アクセサーの戻り値を取得します。 set アクセサーは値を割り当てます。
value キーワードは、セット インデクサーによって割り当てられる値を定義するために使用されます。
インデクサーは整数値に基づいてインデックスを作成する必要はありません。特定の検索メカニズムを定義するのはユーザー次第です。
インデクサーは過負荷になる可能性があります。
<3> 属性とインデクサーの主な違い:
a. クラスの各属性には一意の名前が必要であり、クラス内で定義された各インデクサーには一意の署名またはパラメーター リストが必要です (これにより、インデクサーの再ロードが可能になります)。
b. プロパティは静的 (静的) にすることができ、インデクサーはインスタンスのメンバーである必要があります。
<4>、インデクサーのオーバーロードの例:
using System; using System.Collections.Generic; public class Student { public List<Student> listStudents = new List<Student>(); public Student this[int i,string name] { get { foreach (Student stu in listStudents.ToArray()) { if (stu.sid == i && stu.name == name) //按照学号和姓名取出学生 { return stu; } } return null; } set { listStudents[i] = value; } } private int sid; //学号 public int Sid { get { return sid; } set { sid = value; } } private string name;//姓名 public string Name { get { return name; } set { name = value; } } private int score; //总分 public int Score { get { return score; } set { score = value; } } public Student(int sid, string name, int score) { this.sid = sid; this.name = name; this.score = score; } public Student() { this.listStudents.Add(new Student(1, "jeff wong", 375)); this.listStudents.Add(new Student(2,"jeffery zhao",450)); this.listStudents.Add(new Student(3,"terry lee",400)); this.listStudents.Add(new Student(4,"dudu",500)); } } class Program { static void Main(string[] args) { Student student = new Student(); Student stu = student[1, "jeff wong"]; Console.WriteLine("student number:" + stu.Sid + ",name:" + stu.Name + ",score:" + stu.Score); Console.Read(); } }
C# プロパティとインデクサーに関連するその他の記事については、PHP 中国語 Web サイトに注目してください。