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

本文介绍了C#中的构造器、属性和索引器。构造器分为实例构造器和静态构造器,无参构造器会自动创建,而基类构造器可以通过`base`关键字显式调用。属性包括set和get访问器,自动实现属性简化了字段管理。索引器类似带参数的属性,用于访问多个数据成员,且只能为实例索引。通过不同方式(属性、构造器、索引器)可以实现数据的设置和获取,其中索引器提供了简洁的访问方式。

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

如果程序员没有显示声明一个构造函数,程序会自动生成一个无参构造函数。
类的实例构造函数:不能有返回值(连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 Program
10       {
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 Str
27       {
28           private string m_str;
29           public string Name
30           {
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 Program
10       {
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 Str
25       {
26           private string m_str;
27           public Str(string name)
28           {
29               m_str = name;
30           }
31           public string Name
32           {
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 Program
10       {
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 Str
25       {
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   }
复制代码

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值