【C#】索引器

前沿:

  索引器:索引器允许类或结构的实例就像数组一样进行索引。 索引器类似于属性,不同之处在于它们的访问器采用参数。

正文:

  在看索引器前,我们先看看C#的属性,面向对象设计和编程的重要原则之一就是数据封装,也就是我们在类中定义的字段永远不应该对外公开,假如我们定义了下面一个类

public class Employee
{
    public string Name;
    public int Age;
}

 那么我们在外面可以很随意的破换一个Employee对象:

Employee e=new Employee();
e.Age=-1;

 这里我们可以看出来,年龄为-1是不符合逻辑的,年龄一般只有自己知道,自己可以随便说出一个范围(小姐,你今年多大了?——————我18)。所以我们一般是会把字段定义为私有的,外部想要访问可以,我可以给你一个公开的方法,但我自己规定我的年龄范围,你只能在这个范围里面来猜测测。

  class Employee
    {
        private string name;
        private Int32 age;

        public void SetAge(Int32 value)
        {
            if (value < 0)
                throw new ArgumentOutOfRangeException("年龄不能为小于0");
            age = value;
        }

        public Int32 GetAge()
        {
            return age;
        }
    }

 这样我们就实现了数据字段的封装,当你试图给字段提供一个不合理的数值时,就会抛出异常,但这里却多出了两个方法,也就是说我们不得不实现额外的方法来封装我们的字段。于是C#就提供了属性,额外的方法默认有编译器提供,我们只需要这样来定义就可以了

   public Int32 Age
        {
            get { return age; }
            set
            {
                if (value < 0)
                    throw new ArgumentOutOfRangeException("年龄不能小于0");

                age = value;
            }
        }

 以上就是无参属性(为什么称为无参属性,是因为这里我们的get访问器方法是不接受参数的,我们直接返回特定的一个字段值),也就是我们经常定义的对象属性,既然有无参属性,那么随之对应的就应该是有参属性。

有参属性:(也就是索引器了)

  有参属性,他的get访问器可以接受一个或多个参数,set 访问器可以接受两个或多个参数:下面我们看一个例子,这个类允许以数组风格的语法来索引由这个类的一个实例维护的一个数组。  

 class SampleCollection<T>
    {
        // Declare an array to store the data elements.
        private T[] arr = new T[100];
        public T this[int i]
        {
            get
            {

                return arr[i];
            }
            set
            {
                arr[i] = value;
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // Declare an instance of the SampleCollection type.
            SampleCollection<string> stringCollection = new SampleCollection<string>();

            // Use [] notation on the type.
            stringCollection[0] = "Hello, World";
            System.Console.WriteLine(stringCollection[0]);
        }
    }

 这里给出一个动态切换语言版本的一个实例

public class LanguageManager
    {
        private static LanguageManager instance = new LanguageManager();
        public static LanguageManager Instance { get { return instance; } }

        public IList<LangInfo> Langs { get; private set; }

        private LanguageManager()
        {
            Langs = new LangInfo[]
            {
                new LangInfo()
                {
                    Name = "中文", 
                    Uri = new Uri(/Lang/zh-cn.xaml", UriKind.RelativeOrAbsolute),
                    CultureInfo = new System.Globalization.CultureInfo("zh-cn"),
                },
                new LangInfo()
                {
                    Name="English",
                    Uri = new Uri("、Lang/en-us.xaml", UriKind.RelativeOrAbsolute),
                    CultureInfo = new System.Globalization.CultureInfo("en-us"),
                },
            };
        }

        public LangInfo this[string name]
        {
            get { return Langs.SingleOrDefault(l => l.Name == name); }
        }

        public LangInfo this[int i]
        {
            get { return Langs[i]; }
        }
    }
 Uri uri = LanguageManager.Instance[lang].Uri;

 希望对你有一点点帮助(其实,有时候学习一个知识点是很容易的,关键是你要知道怎么用,以及什么场合下用就不容易了,还需要慢慢体会)!

原文地址:https://www.cnblogs.com/wywnet/p/3854681.html