访问修饰符说明
new 仅允许在嵌套类声明时使用,表明类中隐藏了由基类中继承而来的并且与基类同名的成员
public 声明为公共类,表示不限制对该类的访问
protected 声明为受保护类,表示只能从所在类和所在类派生的子类进行访问
internal 声明为内部类,表示只有其所在类才能访问
private 声明为私有类,访问仅限于本类
abstract 声明为抽象类,访问不受限制,但该类不能被实例化,只能被继承
sealed 声明为密封类,不允许被继承,只能被实例化
静态构造函数
静态构造函数时c#的一个新特性,很少用到。不过当我们想初始化一些静态变量的时候就可以声明一个静态构造函数。这个构造函数时属于类的,而不是属于哪个实例的,因此这个构造函数只会被执行一次。也就是在创建第一个实例或引用任何静态成员之前,由.NET自动调用。声明静态构造函数,只需要在构造函数名前面使用static修饰符就可以,例如:
class StaticClass
{
statci StaticClass()
{
}
}
在使用静态构造函数的时候应该注意以下几点:
·静态构造函数既没有访问修饰符,也没有参数。因为是.NET调用的,所以像public和private等修饰符就没有意义了。
·在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了。
·一个类只能有一个静态构造函数。
·无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。
·最多只运行一次。
·静态构造函数不可以被继承。
·如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Person
{
class Person
{
static private string name;
static private int age;
static Person()
{
Console.WriteLine("The static");
}
public static void ShowPersonInfo()
{
Console.WriteLine("The ShowPersonInfo");
Console.WriteLine("Name:{0}\tAge:{1}", Person.name, Person.age);
}
}
class Program
{
static void Main(string[] args)
{
Person.ShowPersonInfo();
}
}
}
在此示例中,类Person有一个静态构造函数和两个静态数据成员name、age,以及一个静态成员函数ShowPersonInfo()。当调用静态的成员函数时,首先触发静态构造函数的执行,通过静态构造函数来初始化类中的成员,最后再执行静态的成员函数。因此,先输出静态构造函数的语句后,再输出静态成员函数的输出语句。
析构函数
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Person
{
class First
{
~First()
{
Console.WriteLine("First");
}
}
class Second:First
{
~Second()
{
Console.WriteLine("Second");
}
}
class Third : Second
{
~Third()
{
Console.WriteLine("Third");
}
}
class Program
{
static void Main(string[] args)
{
Third t = new Third();
}
}
}
类与结构的比较
在c#语言中,结构类可以拥有构造器、析构器、成员变量、方法、属性、操作数及嵌套类型等,和类非常类似;主要的不同点在于结构类型通常是由简单的数据类型组合而成的值类型,类则是引用类型。因此,前者放在栈(stack)中,不必通过参考指针(reference)的方式存取;而类属于参考类型(reference type),仅仅是将引用地址存放在栈里,而具体的值则存放在堆(heap)里。