基本访问修饰符

  1. Public - 公开的都可访问。
  2. Internal - 程序集内可访问。
  3. Protected - 子类可以访问父类,其他类不可访问。
  4. Private - 私有的,仅当前类可访问。
  5. Protectef Internal - 在当前程序集内可访问,在其他程序集内需通过派生类类型的变量进行访问。

用VS新建的类在不添加修饰符字段的情况下默认是Internal,字段默认的是Private,接口默认的是Public。

值传递和引用传递

  1. 通过值传递传递参数的话,形参接收到的参数是实参的副本,所以在对形参进行更改的时候,对实参本身没有任何影响。
  2. 通过引用传递传递参数的话,形参接收到的参数就是实参的本身的地址了,形参和实参指向了同一个存储单元,所以在对形参进行更改的时候,对实参本身也进行了更改。
    这里顺道解释一下什么是实参什么是形参,比如下面的例子。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void Function1()
    {
    int x = 0;
    Function2(x);// x - 实参
    }

    public void Function2(int y) // 形参
    {
    }

ref和out关键字

相同点:ref和out都通过引用传递的方式传递参数。

不同点:

  1. ref将参数值传入方法,out无法将参数值传入方法。
  2. ref传入参数前必须先初始化,out不必在传入参数前初始化,但在方法中需初始化。
    网上的一句总结:ref有进有出,out无进有出。

使用:

  1. 当一个值类型很大时,而这个方法经常被调用的时候,为了避免大量浪费栈空间,可以使用ref参数。
  2. 当需要返回不同类型的值的时候,就可以用out参数。当然out参数也可返回单个值。

const和readonly关键字

  1. const属于编译时赋值。在编译的时候就编译好了,所以主要用于一些常量,不会变的数值。
  2. readonly属于运行时赋值。简单的说则是除了静态方法以外,每次初始化实例的时候,才会给相应的数据赋值,以及可以在构造函数进行赋值操作。适用于初始化完毕之后就固定下来的内容。

IEnumerable、ICollection、IList

    这三种接口的区别其实可以在编辑器敲出来然后F12进去看一下。这里还带了一个知识点,就是接口是可以多继承的。
IEnumerable接口只提供了一个获取迭代器的方法,这就是foreach能遍历实现了IEnumerable接口集合的原因。

1
2
3
4
public interface IEnumerable
{
IEnumerator GetEnumerator();
}

ICollection继承了IEnumerable的方法,然后额外提供了添加、删除、更新等操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public interface ICollection<T> : IEnumerable<T>, IEnumerable
{
int Count
{
get;
}

bool IsReadOnly
{
get;
}

void Add(T item);

void Clear();

bool Contains(T item);

void CopyTo(T[] array, int arrayIndex);

bool Remove(T item);
}

IList同时实继承了ICollection、IEnumerable,在这两个接口的基础上提供了另外的添加、移除功能,还提供了查询item对应的索引值的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable
{
T this[int index]
{
get;
set;
}

int IndexOf(T item);

void Insert(int index, T item);

void RemoveAt(int index);
}

从上述基本上可以得知,在性能上IEnumerable > ICollection > IList。
在只遍历的情况下,使用IEnumerable;
对集合进行操作,用ICollection;
需要用到集合的索引的时候,用IList;