C#索引器

说索引器之前先来了解一下属性:它提供灵活的机制来读取、编写或计算某个私有字段的值。 可以像使用公共数据成员一样使用属性,但实际上它们是称作“访问器”的特殊方法。 这使得可以轻松访问数据,此外还有助于提高方法的安全性和灵活性。

class Program
    {
        static void Main(string[] args)
        {
            DemoGet_Set demo = new DemoGet_Set() { };
            demo.Name = "ss!";
            demo.UserId = demo.Name;
            Console.WriteLine(demo.UserId);
            Console.ReadLine();
        }
        
    }

    public class DemoGet_Set
    {
        /// <summary>
        /// 获取名字
        /// </summary>
        private string name;
        public string Name { get { return name; } 
            set { name = value + "aa"; }
        }
        /// <summary>
        ///  获取用户Id
        /// </summary>
        public string UserId { get; set; }
    }

属性的概述:

  • 属性使类能够以一种公开的方法获取和设置值,同时隐藏实现或验证代码。

  • get 属性访问器用于返回属性值,而 set 访问器用于分配新值。 这些访问器可以有不同的访问级别。

  • value 关键字用于定义由 set 取值函数分配的值。

  • 不实现 set 取值函数的属性是只读的。

  • 对于不需要任何自定义访问器代码的简单属性,可考虑选择使用自动实现的属性。 有关更多信息 参考自:C# 编程指南

  • get;set 此时都需要,如果缺少get 与set 会发生语法错误。如果你需要使用只读的属性需要设置一个privates 私有的set就行

索引器:有参的属性就称为索引器,允许类或结构的实例就像数组一样进行索引:

索引器定义方式:参考http://blog.csdn.net/dyllove98/article/details/9105833

[修饰符] 数据类型 this[索引类型 index]
{ 
  get{//获得属性的代码}
  
set{ //设置属性的代码}
}
  1. 修饰符包括 public,protected,private,internal,new,virtual,sealed,override, abstract,extern.
  2. 索引器类型表示该索引器使用哪一类型的索引来存取数组或集合元素,可以是整数,可以是字符串;this表示操作本对象的数组或集合成员,可以简单把它理解成索引器的名字,因此索引器不能具有用户定义的名称。索引器参数可以不止一个,类型也不限于int,几乎可以是任意类型
class Program
    {
        static void Main(string[] args)
        {
            DemoGet_Set demo = new DemoGet_Set() { };
            demo.Name = "ss!";
            demo.UserId = demo.Name;
            Console.WriteLine(demo["UserId"]);
            Console.ReadLine();
        }
        
    }

    public class DemoGet_Set
    {
        private Dictionary<string, string> dic = new Dictionary<string, string>() { };
        /// <summary>
        /// 获取名字
        /// </summary>
        public string Name
        {
            get
            {
                return this["Name"];
            }
            set
            {
                this["Name"] = value;
            }
        }
        /// <summary>
        /// 定义索引器
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        public string this[string index] { 

        get { return dic[index].ToString();}

        set { dic.Add(index,value); }

        }
        /// <summary>
        ///  获取用户Id
        /// </summary>
        public string UserId
        {
            get
            {
                return this["UserId"];
            }
            set
            {
                this["UserId"] = value;
            }
        }
    }
   
  • 使用索引器可以用类似于数组的方式为对象建立索引。

  • get 访问器返回值。 set 访问器分配值。

  • this 关键字用于定义索引器。

  • value 关键字用于定义由 set 索引器分配的值。

  • 索引器不必根据整数值进行索引,由您决定如何定义特定的查找机制。

  • 索引器可被重载。

  • 索引器可以有多个形参,例如当访问二维数组时。

参考自:C# 编程指南

索引器好处:C#中的类成员可以是任意类型,包括数组和集合。当一个类包含了数组和集合成员时,索引器将大大简化对数组或集合成员的存取操作

索引器可以很好的用来读取配置文件:

public class SysConfig
    {
        // Fields
        private static SysRead m_SysRead;

        // Methods
        public static string sValue(string sKey)
        {
            string sPath = AppDomain.CurrentDomain.BaseDirectory + @"Config";
            if (!Directory.Exists(sPath))
            {
                Directory.CreateDirectory(sPath);
            }
            string xmlFile = sPath + @"Config.Xml";
            if (File.Exists(xmlFile))
            {
                m_SysRead = new SysRead(xmlFile);
                if (sKey == "Conn")
                {
                    return m_SysRead.sConnection;
                }
                return m_SysRead[sKey];
            }
            //MessageBox.Show("读配置文件失败", "提示", MessageBoxButtons.OK);
            return "";
        }
    }
    public class SysRead
    {
        // Fields
        private XmlDocument m_xmlDoc;
        private string m_xmlFile;
        private static XmlNode m_xmlNode;

        // Methods
        public SysRead(string sXmlFile)
        {
            try
            {
                this.m_xmlFile = sXmlFile;
                this.m_xmlDoc = new XmlDocument();
                this.m_xmlDoc.Load(this.m_xmlFile);
                m_xmlNode = this.m_xmlDoc.SelectSingleNode("Config");
            }
            catch
            {
                //MessageBox.Show("配置文件中存在非法字符", "提示", MessageBoxButtons.OK);
            }
        }

        ~SysRead()//【布颜书】注意这里用~符号来写也是一种方式噢
        {
            m_xmlNode = null;
            this.m_xmlDoc = null;
        }

        private static string getConnValue(string sKey)
        {
            try
            {
                string[] param = new string[2];
                param = sKey.Split(new char[] { '.' });
                XmlNodeList nodelist = m_xmlNode.ChildNodes;
                foreach (XmlElement xE in nodelist)
                {
                    if (xE.Name == param[0])
                    {
                        return xE.GetAttribute(param[1]);
                    }
                }
            }
            catch
            {
                return "";
            }
            return "";
        }

        // Properties
        public string this[string sKey]
        {
            get
            {
                return getConnValue(sKey);
            }
        }

        public string sConnection
        {
            get
            {
                return ("database=" + this["connect.DataBase"] + "; Server=" + this["connect.ServerIp"] + ";User ID=" + this["connect.Uid"] + ";Password=" + this["connect.Pw"] + ";Persist Security Info=True");
            }
        }
    }

例子参考:http://www.cnblogs.com/aspnethot/articles/1386650.html

原文地址:https://www.cnblogs.com/linfangshuhellowored/p/4579224.html