今天来说一下类的成员。
类的成员有访问修饰符,字段,构造函数,析构函数,属性,索引器。
类有五种访问修饰符:public、private、protected、internal最后一个是protected与internal的组合。这几种修饰符使用范围各有不同,public可以修饰所有的类成员,同一个解决方案中的其他的类可以访问所有的用public修饰的另一个类的成员。但是枚举与接口除外,它两个不可以用任何的修饰符来修饰,系统默认是public的。用private修饰符修饰的成员是私有的,只有本类中的成员可以访问。protected修饰的成员可以被本类和继承类所访问。internal是在同一命名空间的可以访问。protected internal 是一个组合修饰符,用该修饰符修饰的类的成员可以被同一命名空间或继承类访问。
字段被定义在类或方法中,一般为私有的,目的是保护数据不被恶意改变。只读字段只能在构造函数中初始化。
构造函数名与类名相同,构造函数可以重载,在实例化对象的时候除非自己调用了有参的构造函数,否则系统将自动调用无参的构造函数。如果在类中定义字段的时候没有给它初始化,则构造函数会给它初始化成默认值。
析构函数与构造函数相反,是用来释放内存的。它不用任何的修饰符,只有一个函数名,函数名与类名相同。
属性是用来封转数据的,对数据起到保护的作用,属性的定义与方法类似,只有签名没有参数,属性的内部包含两个访问器:get访问器和set访问器。get用来接收参数,set用来设置返回值。一个属性中可以只包含一个访问器,但是不可以一个访问器都不设,只有get的是只读属性,只有set的是只写属性。
索引器也可以称作是有参属性,它的定义与属性非常相似,同样有get和set访问器,索引器是把对象本身当成序列,用this关键字。索引器可以被重载,可以有多个参数,在调用索引器的时候可以直接采用对象加下标的方式去调用,这个很类似与系统提供的ArrayList这个类所实现的功能了。鉴于此,我们可以尝试自己用索引器去创建一个类,来实现ArrayList所实现的所有的方法。
下面是这个设想的具体实现:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Collections;
- namespace MakeMyArrayList
- {
- class Program
- {
- static void Main(string[] args)
- {
- MyArrayList mal = new MyArrayList();
- mal.Add(1);
- mal.Add(2);
- mal.Add(3);
- mal.Add(4);
- mal.Add(5);
- mal.Add(6);
- mal.Add(7);
- mal.Add(8);
- mal.Add(9);
- mal.Add(10);
- mal.Add(11);
- //mal.Insert(2, 99);
- //Console.WriteLine(mal.Contains(188));
- //mal.RemoveAt(6);
- //mal.Reverse(3, 4);
- //mal.Remove(9);
- //mal.Clear();
- foreach (object o in mal)
- {
- Console.WriteLine(o);
- }
- Console.WriteLine("数量" + mal.Count);
- Console.WriteLine("容量" + mal.Capacity);
- }
- }
- class MyArrayList : IEnumerable
- {
- int count = 0;
- //计算元素个数的属性
- public int Count
- {
- get
- {
- return count;
- }
- }
- //计算容量的属性
- public int Capacity
- {
- get
- {
- return objarr.Length;
- }
- set
- {
- if (value < count)
- {
- throw new Exception("容量小于元素个数");
- }
- else
- {
- object[] newobjectarr = new object[value];
- for (int i = 0; i < count; i++)
- {
- newobjectarr[i] = objarr[i];
- }
- objarr = newobjectarr;
- }
- }
- }
- //创建一个新数组
- object[] objarr = new object[0];
- //索引器
- public object this[int index]
- {
- get
- {
- if (index < count)
- {
- return objarr[index];
- }
- else
- {
- throw new Exception("超出索引界限");
- }
- }
- set
- {
- if (index < count)
- {
- objarr[index] = value;
- }
- else
- {
- throw new Exception("索引超出界限");
- }
- }
- }
- //无参的构造函数
- public MyArrayList()
- {
- }
- //有参的构造函数
- public MyArrayList(int i)
- {
- objarr = new object[i];
- }
- //清除所有元素的方法
- public void Clear()
- {
- for (int i = 0; i < objarr.Length; i++)
- {
- objarr[i] = null;
- count--;
- }
- count =0;
- }
- //反转所有元素的方法
- public void Reverse()
- {
- object[] newobjectarr = new object[count];
- for (int i = 0; i < count; i++)
- {
- newobjectarr[i] = objarr[count - i - 1];
- }
- objarr = newobjectarr;
- }
- //指定位置的反转方法
- public void Reverse(int index, int count)
- {
- object[] ob = new object[1];
- for (int i = 0; i < (count) / 2; i++)
- {
- ob[0] = objarr[index + i];
- objarr[index + i] = objarr[count - 1 + index - i];
- objarr[count - 1 + index - i] = ob[0];
- }
- }
- //添加元素的方法
- public int Add(object value)
- {
- if (objarr.Length == 0)
- {
- objarr = new object[4];
- objarr[0] = value;
- count++;
- return count;
- }
- else
- {
- if (count < objarr.Length)
- {
- objarr[count] = value;
- count++;
- return count - 1;
- }
- else
- {
- object[] newobjectarr = new object[objarr.Length * 2];
- for (int i = 0; i < objarr.Length; i++)
- {
- newobjectarr[i] = objarr[i];
- }
- newobjectarr[count] = value;
- count++;
- objarr = newobjectarr;
- return count - 1;
- }
- }
- }
- //删除元素的方法
- public void Remove(object value)
- {
- int index = -1;
- for (int i = 0; i < count; i++)
- {
- if (value.Equals(objarr[i]))
- {
- index = i;
- break;
- }
- }
- if (index != -1)
- {
- for (int i = index; i < count; i++)
- {
- objarr[i] = objarr[i + 1];
- }
- objarr[count - 1] = null;
- count--;
- }
- }
- //指定位置的删除元素的方法
- public void RemoveAt(int index)
- {
- object[] ob = new object[1];
- ob[0] = objarr[count - 1];
- for (int i = 0; i < count; i++)
- {
- if (i == index)
- {
- for (int j = i; j < count - index; j++)
- {
- objarr[j] = objarr[j + 1];
- }
- }
- }
- count -= 1;
- objarr[count - 1] = ob[0];
- }
- //判断是否包含某个元素的方法
- public bool Contains(object value)
- {
- for (int i = 0; i < count; i++)
- {
- if (value.Equals(objarr[i]))
- {
- return true;
- }
- }
- return false;
- }
- //插入元素的方法
- public void Insert(int index, object value)
- {
- object[] ob = new object[count -index+1 ];
- for (int i = 0; i < count+1 ; i++)
- {
- if (i == index)
- {
- ob[0] = objarr[i];
- objarr[i] = value;
- count += 1;
- for (int j = 1; j < count-index ; j++)
- {
- ob[j] = objarr[i + j ];
- objarr[i+j ] = ob [j -1];
- }
- }
- }
- }
- //遍历整个数组
- public IEnumerator GetEnumerator()
- {
- for (int i = 0; i < count; i++)
- {
- yield return objarr[i];
- }
- }
- }
- }
这就是今天的内容了。大家午安 ~ ~ ~