——构造器(构造函数):
如果程序员没有显示声明一个构造函数,程序会自动生成一个无参构造函数。
类的实例构造函数:不能有返回值(连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 }
同样的结果,使用了三种不同的方式。
第一种方式,赋值都在属性中实现,类数组成员的赋值过程过于繁琐。
第二种方式,使用构造器简化了第一种方式对于类数组成员的赋值操作。
第三种方式,使用索引器的方式显然是最简洁的。它无需再定义一个类的数组,实质上是将数组的功能封装到了索引器内部去实现。同时,由于赋值都在索引器中实现,比在属性中实现要简洁(第一种方式),也不需要构造器了。(第二种方式)
本文介绍了C#中的构造器、属性和索引器。构造器分为实例构造器和静态构造器,无参构造器会自动创建,而基类构造器可以通过`base`关键字显式调用。属性包括set和get访问器,自动实现属性简化了字段管理。索引器类似带参数的属性,用于访问多个数据成员,且只能为实例索引。通过不同方式(属性、构造器、索引器)可以实现数据的设置和获取,其中索引器提供了简洁的访问方式。


2169

被折叠的 条评论
为什么被折叠?



