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 }
同样的结果,使用了三种不同的方式。
第一种方式,赋值都在属性中实现,类数组成员的赋值过程过于繁琐。
第二种方式,使用构造器简化了第一种方式对于类数组成员的赋值操作。
第三种方式,使用索引器的方式显然是最简洁的。它无需再定义一个类的数组,实质上是将数组的功能封装到了索引器内部去实现。同时,由于赋值都在索引器中实现,比在属性中实现要简洁(第一种方式),也不需要构造器了。(第二种方式)
- C#_构造器、属性、索引器
- 黑马程序员_字段、属性、索引器
- C#------构造函数、属性、索引器、事件、运算符和析构函数
- C#索引器与索引属性_百度文库
- C#_索引器的使用
- c#_索引器(Indexer)
- C#类的属性和索引器
- java基础_day0020_类的封装性_属性_方法_构造器
- 反射机制_介绍_Class对象获取_动态操作_构造器_方法_属性JAVA211-212
- 10_传智播客Spring2.5视频教程_使用构造器装配属性
- 属性 & 便利构造器
- javascript构造器属性
- c#属性 索引器
- 属性和索引器
- C#索引器,属性
- 常量、字段、方法、属性和索引器(C#)
- 《Inside C#》笔记(六) 属性、数组、索引器
- 字节码操作_javassist库_动态创建新类_属性_方法_构造器_API详解JAVA216-217
- Abby 的证件照
- php单引号与双引号
- 【转载】Java I/O系统基础知识
- 复合列的not in的问题
- COM 组件设计与应用(二)——GUID 和 接口
- C#_构造器、属性、索引器
- ListView异步加载远端图片
- Java内存管理
- 嵌入式系统 Boot Loader 技术内幕
- java EXception
- PDU格式详解
- java 集合
- [VB]UserControl中的主要事件
- C#的XML文件的读取与写入