C# 索引器使用總結

一、索引器(Indexer):數組

索引器容許類或者結構的實例按照與數組相同的方式進行索引。索引器相似於屬性,不一樣之處在於他們的訪問採用參數。函數

最簡單的索引器的使用this

    /// <summary>
    /// 最簡單的索引器
    /// </summary>
    public class IDXer
    {
        private string[] name=new string[10];

        //索引器必須以this關鍵字定義,其實這個this就是類實例化以後的對象
        public string this[int index]
        {
            get 
            {
                return name[index];
            }
            set
            {
                name[index] = value;
            }
        }  
    }
        
    public class Program
    {
        static void Main(string[] args)
        {
            //最簡單索引器的使用           
            IDXer indexer = new IDXer();
            //「=」號右邊對索引器賦值,其實就是調用其set方法
            indexer[0] = "張三";
            indexer[1] = "李四";
            //輸出索引器的值,其實就是調用其get方法
            Console.WriteLine(indexer[0]);
            Console.WriteLine(indexer[1]);
            Console.ReadKey();
        }
    }

 二、索引器與數組的區別:spa

  • 索引器的索引值(Index)類型不限定爲整數:

        用來訪問數組的索引值(Index)必定爲整數,而索引器的索引值類型能夠定義爲其餘類型。code

  • 索引器容許重載

        一個類不限定爲只能定義一個索引器,只要索引器的函數簽名不一樣,就能夠定義多個索引器,能夠重載它的功能。orm

  • 索引器不是一個變量

        索引器沒有直接定義數據存儲的地方,而數組有。索引器具備Get和Set訪問器。對象

三、索引器與屬性的區別:blog

  • 索引器以函數簽名方式 this 來標識,而屬性採用名稱來標識,名稱能夠任意
  • 索引器能夠重載,而屬性不能重載。
  • 索引器不能用static 來進行聲明,而屬性能夠。索引器永遠屬於實例成員,所以不能聲明爲static。

以字符串做爲下標,對索引器進行存取:索引

    //以字符串爲下標的索引器
    public class IDXer2
    {
        private Hashtable name = new Hashtable();

        //以字符串爲下標的索引器
        public string this[string index]
        {
            get
            {
                return name[index].ToString();
            }
            set
            {
                name.Add(index, value);
            }
        } 
    }

    public class Program
    {
        static void Main(string[] args)
        {
            //以字符串爲下標的索引器
            IDXer2 indexer2 = new IDXer2();
            indexer2["A01"] = "張三";
            indexer2["A02"] = "李四";
            Console.WriteLine(indexer2["A01"]);
            Console.WriteLine(indexer2["A02"]);
            Console.ReadKey();
        }
}

  多參數索引器及索引器的重載字符串

    /// <summary>
    /// 成績類
    /// </summary>
    public class Scores
    {
        /// <summary>
        /// 學生姓名
        /// </summary>
        public string StuName { get; set; }

        /// <summary>
        /// 課程ID
        /// </summary>
        public int CourseId { get; set; }

        /// <summary>
        /// 分數
        /// </summary>
        public int Score { get; set; }
       
    }

    /// <summary>
    /// 查找成績類(索引器)
    /// </summary>
    public class FindScore
    {
        private List<Scores> listScores;

        public FindScore()
        {
            listScores = new List<Scores>();
        }

        //索引器 經過名字&課程編號查找和保存成績
        public int this[string stuName, int courseId]
        {
            get
            {
                Scores s = listScores.Find(x => x.StuName == stuName && x.CourseId == courseId);
                if (s != null)
                {
                    return s.Score;
                }
                else
                {
                    return -1;
                }
            }
            set
            {
                listScores.Add(new Scores() { StuName = stuName, CourseId = courseId, Score = value });
            }
        }

        //索引器重載,根據名字查找全部成績
        public List<Scores> this[string stuName]
        {
            get
            {
                List<Scores> tempList = listScores.FindAll(x => x.StuName == stuName);
                return tempList;
            }
        }
    }

   static void Main(string[] args)
   {
       //多參數索引器和索引器重載          
       FindScore fScore = new FindScore();
       fScore["張三", 1] = 98;
       fScore["張三", 2] = 100;
       fScore["張三", 3] = 95;
       fScore["李四", 1] = 96;
       //查找 張三 課程編號2 的成績
       Console.WriteLine("李四 課程編號2 成績爲:" + fScore["李四", 1]);
       //查找全部張三的成績
       List<Scores> listScores = fScore["張三"];
       if (listScores.Count > 0)
       {
          foreach (Scores s in listScores)
          {
             Console.WriteLine(string.Format("張三 課程編號{0} 成績爲:{1}", s.CourseId, s.Score));
          }
       }
       else
       {
           Console.WriteLine("無該學生成績單");
       }
       Console.ReadKey();
   }

 --==源碼下載==--

相關文章
相關標籤/搜索