Heim  >  Artikel  >  Backend-Entwicklung  >  c#-Eigenschaften und Indexer

c#-Eigenschaften und Indexer

高洛峰
高洛峰Original
2016-12-17 09:26:291184Durchsuche

1. Attribute
Die sogenannten Attribute sind eigentlich spezielle Klassenmitglieder, die einen kontrollierten Zugriff auf private Klassenfelder implementieren. Es gibt zwei Attributmethoden in der C#-Sprache: Eine ist get, mit der der Wert des privaten Felds zurückgegeben werden kann, und die zweite ist set, mit der der Wert des privaten Felds festgelegt werden kann. Nehmen Sie beispielsweise den folgenden Code als Beispiel, um ein Studentennamenattribut zu erstellen und den kontrollierten Zugriff auf das Namensfeld zu steuern:

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. Indexer
Einfach ausgedrückt ist der sogenannte Indexer ein Art von speziellen Eigenschaften, über die Sie Ihre eigene Klasse wie ein Array referenzieren können. Offensichtlich ist diese Funktion besonders nützlich beim Erstellen von Sammlungsklassen, aber in anderen Situationen, beispielsweise bei der Verarbeitung großer Dateien oder der Abstraktion bestimmter begrenzter Ressourcen, ist es natürlich auch sehr nützlich, in einer Klasse ein Array-ähnliches Verhalten zu haben. Im obigen Beispiel gehen wir beispielsweise davon aus, dass es mehrere Schüler in einer Klasse gibt. Der Aufbau des Indexers kann einfach aufgerufen werden:

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();
    }
}

Im obigen Code sehen wir, dass der Zugriffsmechanismus des Indexers verwendet wird Wenn Sie einen Parameter angeben (Parameter ist eine Ganzzahl), können Sie tatsächlich einen Indexer mit mehreren Parametern erstellen. Am Beispiel des obigen Codes möchten wir die Gesamtpunktzahl des Schülers basierend auf seiner Schülernummer und seinem Namen ermitteln. Der geänderte Code lautet wie folgt:

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();
    }
}

3 ;1>,

Attributdefinition:

Zugriffsmodifikator-Rückgabetyp-Attributname

get{Anweisungssammlung}
set{Anweisungssammlung}


Definition des Indexers:

Zugriffsmodifikator-Rückgabetyp this[Parametertypparameter...]


get{Anweisungssammlung}
gesetzt {Anweisungssammlungen }

2cc198a1d5eb0d3eb508d858c9f5cbdb,


Indexer ermöglichen die Indizierung von Objekten auf ähnliche Weise wie Arrays.

Dieses Schlüsselwort wird verwendet, um den Indexer zu definieren.
Accessor-Rückgabewert abrufen. Der Set-Accessor weist einen Wert zu.
Das Schlüsselwort value wird verwendet, um den vom Set-Indexer zugewiesenen Wert zu definieren.
Der Indexer muss nicht auf der Grundlage ganzzahliger Werte indizieren. Es liegt an Ihnen, den spezifischen Suchmechanismus zu definieren.
Indexer können überlastet sein.
5bdf4c78156c7953567bb5a0aef2fc53 Der Hauptunterschied zwischen Attributen und Indexern:
a. Jedes Attribut einer Klasse muss einen eindeutigen Namen haben und jeder in der Klasse definierte Indexer muss eine eindeutige Signatur haben (). damit eine Indexerüberladung implementiert werden kann).
b. Eigenschaften können statisch (statisch) sein und Indexer müssen Instanzmitglieder sein.
23889872c2e8594e0f446a471a78ec4c, Beispiel für Indexer-Überladung:

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; }
    }

    /// <summary>
    /// 索引器重载
    /// </summary>
    /// <param name="i"></param>
    /// <returns></returns>
    public Student this[int i] //i从0开始
    {
        get { return listStudents[i]; }
        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.WriteLine("all the students:");

        for (int i = 0; i < student.listStudents.Count; i++)
        {
            Console.WriteLine("student number:" + student[i].Sid + ",name:" + student[i].Name + ",score:" + student[i].Score);
        }

        Console.Read();
    }
}



Weitere C#-Eigenschaften und Indexer-bezogene Artikel Bitte beachten Sie PHP chinesische Website!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn