C#_构造器、属性、索引器

来源:互联网 发布:carp算法 编辑:程序博客网 时间:2024/05/16 10:22

——构造器(构造函数):

如果程序员没有显示声明一个构造函数,程序会自动生成一个无参构造函数。
类的实例构造函数:不能有返回值(连void都不能写),与类名一样。
类的静态构造函数:不仅不能有返回值,而且不能加修饰符(它默认只能是private),不能带参数(默认只能是无参构造函数)。

class A

{
  public A(){} //类A的无参构造函数
  public A(int str){} //类A的有参构造函数
}
class B:A
{
  public B(){} //类B的无参构造函数
  public B(int str){} //类B的有参构造函数
}
如果类B继承类A,那么无论类B调用的是自己的无参构造函数还是自己的有参构造函数,程序都会先调用基类(即类A)的无参构造函数。
除非使用base关键字:
class B:A
{
  public B(int str):base(str)
  {
    //方法体
  } 
}
只有这样的显示调用,程序在执行类B的时候才会先调用基类指定的有参构造函数。
class A
{
  static A()
  {
    //方法体
  }
  public A()
  {
    //方法体
  }
}
class B:A
{
  public B()
  {
    //方法体
  }
  public B(int str)
  {
    //方法体
  }
}
B a = new B();
B b = new B(9);
上面的代码执行顺序是:static A()——public A()——public B()——public A()——public B(int str)

即最先执行的是基类的静态构造函数,然后是基类的无参构造函数,再次才是自身类的构造函数
同时注意的是在同一个程序中,静态构造函数只执行一次。

 

——属性:

——set访问器:

1>有一个隐式参数value,类型与属性类型相同。

2>返回值类型为void

——get访问器:

1>没有参数

2>有一个与属性类型相同的返回值。

——自动实现属性:

如果set;get;

即set和get后面不加方法体(没有大括号),直接以分号结束,则表示自动实现属性,这时候编译器会自动将属性与一个字段相关联。

使用自动实现属性的功能,取代共有字段。

 

——索引器:

可以简单的把索引器理解为:一个带有显式参数的属性(这里的参数是索引参数,不是value)。

索引和属性非常相像:

1>二者都不用分配内存来存储

2>二者都是为了设置和获取其它数据成员而存在的,不同在于属性是为了访问一个数据成员,而索引则是为了访问多个数据成员。

可以把索引理解为设置和获取多个数据成员的属性,通过提供索引可以在多个数据成员之间进行选择。

索引只能为实例索引,即不能声明静态索引。

——set访问器:

1>包含一个隐式参数value,类型和索引类型相同。

2>包含一个显示参数,即索引参数(索引参数写在一个方括号内,类似于数组的形式)。

3>返回值为void类型。

——get访问器:

1>包含一个索引参数。

2>返回值类型和索引类型相同。

索引器的重载:

因为索引器带有显式的参数,所以索引器可以像方法一样进行重载。

重载要求参数列表不同(返回值类型不同没用),参数列表不同包含以下3种情况:

1>参数个数不同。

2>参数类型不同。

3>参数顺序不同。

 

——使用属性、构造器、索引进行设置和获取数据:

——使用属性:

复制代码
 1 View Code  2   using System; 3   using System.Collections.Generic; 4   using System.Linq; 5   using System.Text; 6    7   namespace ConsoleApplication2 8   { 9       class Program10       {11           static void Main(string[] args)12           {13               Str[] s = new Str[10];14               s[0] = new Str();15               s[1] = new Str();16               s[2] = new Str();17               s[0].Name = "张三";18               s[1].Name = "李四";19               s[2].Name = "王五";20               Console.WriteLine("s[0]={0}",s[0].Name);21               Console.WriteLine("s[1]={0}", s[1].Name);22               Console.WriteLine("s[2]={0}", s[2].Name);23           }24       }25   26       class Str27       {28           private string m_str;29           public string Name30           {31               set { m_str = value; }32               get { return m_str; }33           }34       }35   }
复制代码

 ——使用构造器:

复制代码
 1 View Code  2   using System; 3   using System.Collections.Generic; 4   using System.Linq; 5   using System.Text; 6    7   namespace ConsoleApplication2 8   { 9       class Program10       {11           static void Main(string[] args)12           {13               Str[] s = new Str[10];14               s[0] = new Str("张三");15               s[1] = new Str("李四");16               s[2] = new Str("王五");17   18               Console.WriteLine("s[0]={0}",s[0].Name);19               Console.WriteLine("s[1]={0}", s[1].Name);20               Console.WriteLine("s[2]={0}", s[2].Name);21           }22       }23   24       class Str25       {26           private string m_str;27           public Str(string name)28           {29               m_str = name;30           }31           public string Name32           {33               get { return m_str; }34           }35       }36   }
复制代码

——使用索引器:

复制代码
 1 View Code  2   using System; 3   using System.Collections.Generic; 4   using System.Linq; 5   using System.Text; 6    7   namespace ConsoleApplication2 8   { 9       class Program10       {11           static void Main(string[] args)12           {13               Str s = new Str();14               s[0] = "张三";15               s[1] = "李四";16               s[2] = "王五";17   18               Console.WriteLine("s[0]={0}",s[0]);19               Console.WriteLine("s[1]={0}", s[1]);20               Console.WriteLine("s[2]={0}", s[2]);21           }22       }23   24       class Str25       {26           private string[] m_str = new string[10];27        28           public string this[int index]29           {30               set { m_str[index] = value; }31               get { return m_str[index]; }32           }33       }34   }
复制代码

同样的结果,使用了三种不同的方式。
第一种方式,赋值都在属性中实现,类数组成员的赋值过程过于繁琐。
第二种方式,使用构造器简化了第一种方式对于类数组成员的赋值操作。
第三种方式,使用索引器的方式显然是最简洁的。它无需再定义一个类的数组,实质上是将数组的功能封装到了索引器内部去实现。同时,由于赋值都在索引器中实现,比在属性中实现要简洁(第一种方式),也不需要构造器了。(第二种方式)

原创粉丝点击