转自:http://www.hubwiz.com/

get 与 set

  C#类的属性有公有属性(public)和私有属性(private)。如果直接将一个属性声明为public,则该类的任意实例可以随意获取或修改该属性的值,很不安全。.NET Framework中,我们使用get关键字来获取一个公有属性的值,而使用set来设置一个公有属性的值。而在getset中,可以编写代码来控制对属性值的获取和修改。


public class SplaybowClass

{

   //.net2.0及1.1版本设置属性的方式

   private String name; //私有属性

   public String Name

   { //对应name这个私有属性的公有属性

       get {

           return this.name;

       }

       set {

           this.name = value;

       }

   }

   //.net3.5之后,效果与上面一样

   public int Port{get; set;}

}


        注意:

  get和set可以根据实际需要而出现其中一个,不一定两个都要出现。

  例子中公有属性的Name和私有属性的name就一个大小写的差别,这只是一个书写习惯。也有人喜欢在私有属性后加一个下划线(_)。


索引器的定义


  索引器允许类或者结构的实例按照与数组相同的方式进行索引取值,索引器与属性类似,不同的是索引器的访问是带参的。声明与属性有些类似。索引器定义的时候不带有名称,但带有 this 关键字,它指向对象实例。语法如下:


element-type this[type index]

{

  // get 访问器

  get

  {

     // 返回 index 指定的值

  }

 

  // set 访问器

  set

  {

     // 设置 index 指定的值

  }

}


其中: element-type 指元素类型, type 指索引的类型,可以是string、int等。


class DayCollection

{

   string[] days = { "Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat" };

   private int GetDay(string testDay)

   {

       for (int j = 0; j < days.Length; j++)

       {

           if (days[j] == testDay)

           {

               return j;

           }

       }

    }

    public int this[string day]  //索引器的定义,元素类型为int,索引类型为string

   {

       get                        //只有get属性,没有设置set属性

       {

           return (GetDay(day));

       }

   }

}


索引器的用途


  索引器的行为的声明在某种程度上类似于属性(property)。就像属性,可使用 get 和 set 访问器来定义索引器。但是,属性返回或设置一个特定的数据成员,而索引器返回或设置对象实例的一个特定值。换句话说,它把实例数据分为更小的部分,并索引每个部分,获取或设置每个部分。可以使用数组访问运算符([ ])来访问该类或结构的实例。


using System;

using System.Collections;

public class IndexerClass

{

   private string[] name = new string[2];

   public string this[int index]   //索引器必须以this关键字定义,其实这个this就是类实例化之后的对象

   {

       //实现索引器的get方法

       get

       {

           if (index < 2)

           {

               return name[index];

           }

           return null;

       }

 

       //实现索引器的set方法

       set

       {

           if (index < 2)

           {

               name[index] = value;

           }

       }

   }

}

public class Test

{

   static void Main()

   {

     //索引器的使用

     IndexerClass Indexer = new IndexerClass();

     Indexer[0] = "Tom Brown";    //"="号右边对索引器赋值,其实就是调用其set方法

     Indexer[1] = "Jim Green";

     Console.WriteLine(Indexer[0]);   //输出索引器的值,其实就是调用其get方法

     Console.WriteLine(Indexer[1]);

   }

}