呵呵,静态类,静态构造函数,静态字段,静态属性和静态方法。既然是静,那就顾其名思其意吧。

静态成员主要包括静态字段和静态属性,静态成员可以实现类中能够被所有实例对象共享的数据。静态成员属于类所有,无论创建多少实例对象,静态成员在内存中只有一份。

1.什么是静态类呢?简单的来说一个类如果只包含静态成员和静态方法,则该类可以定义为静态类,定义的方法是给该类加上static修饰符。用一个例子简单说明下:

    static class MyStatic
{
private static string staticString = "这是一个静态字段"; public static string StaticString
{
get { return MyStatic.staticString; }
set { MyStatic.staticString = value; }
} public static void ShowMsg()
{
Console.WriteLine(staticString);
}
public static void Main()
{
MyStatic.ShowMsg();
Console.Read();
} }

就像上面所说的那样静态类只能包含静态成员和静态方法,否则编译错误;要强调的是非静态类既可以包含非静态成员和非静态方法,也可以是静态成员和静态方法。

要再说明的一点是静态方法只能访问静态成员和静态方法,但可以间接通过创建实例对象来访问实例成员和实例方法;而实例方法可以直接访问实例成员和静态成员,也可以直接访问实例方法和静态方法。如果觉得绕的话,参考前一句我强调的那句就不难理解了。

这也就解答了我原先总是发现在static Main()函数所在的类里不能引用任何级别访问权限的实例成员,字段和实例方法及一般方法,除非他们被定义为static。道理很清楚,因为Main方法为静态的。

另外静态方法只能由类访问;实例方法只能由对象访问。静态方法不能被标记为vritual,abstract或者override,静态方法可以被派生类访问,但是不能被派生类覆写。(具体的看我昨天写的那个例子----在c#基础----base,this和new,override此文里)


2.再看静态构造函数和实例构造函数

还是看看书中对静态构造函数的定义吧,静态构造函数,用于初始化类中的静态成员,包括静态字段和静态属性。静态构造函数不能带参数,不能有访问修饰符也不能被调用,通常由.Net运行库在第一次调用类成员之前执行。我还是继续把我调试通的代码放在下面:

    class ClassHelper
{
public static string StaticString = "我是一个静态字段";
public string NonStaticString = "我是一个非静态字段"; static ClassHelper()
{
StaticString = "静态字段在静态构造器里被初始化";
} public ClassHelper()
{
NonStaticString = "非静态字段在实例构造器里被初始化";
StaticString = "静态字段也可以在实例化构造器里被初始化";
} } class Program
{
static void Main(string[] args)
{
Console.WriteLine(ClassHelper.StaticString); ClassHelper ch = new ClassHelper();
Console.WriteLine(ClassHelper.StaticString);
Console.WriteLine(ch.NonStaticString);
Console.Read();
}
}

不想再贴msdn和书中冗长的帮助和解释,在这里我就说几点平时用的多的和需要稍加注意的,静态构造函数可以和无参的实例构造函数同存,虽然参数列表相同,但是执行时间不同。另外静态函数只能对静态成员进行初始化操作,不能用于非静态成员。而实例构造函数,可以初始化实例成员,也可以是静态成员,但是静态只读字段除外。(上边的例子很好的解释了)。

构造函数的执行过程是个复杂的部分,它的执行顺序大概是这样的 : 分配静态成员的内存空间→执行静态成员初始化→执行静态构造函数→分配对象实例的内存空间→执行实例成员的初始化→执行实例构造函数

c#基础------------静态类与非静态类的更多相关文章

  1. C#基础(七)——静态类与非静态类、静态成员的区别

    静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例 ...

  2. C# 静态类与非静态类、静态成员的区别

    静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例 ...

  3. 深入理解C# 静态类与非静态类、静态成员的区别

    静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例 ...

  4. 转载 C#中静态类和非静态类比较

    转载原地址: http://www.cnblogs.com/NothingIsImpossible/archive/2010/07/28/1786706.html C#静态方法与非静态方法的区别不仅仅 ...

  5. C# 静态类和非静态类的区别

    静态类和非静态类的区别 静态类: static       关键字 调用 类名.方法 在静态方法中只能访问静态成员  在静态类中只能有静态成员 在非静态类中 即可有非静态成员,也可以有静态成员 在静态 ...

  6. static静态类与非静态类的区别

    static静态类与非静态类的区别 1.在非静态类中可以有实例成员也可以有静态成员 2.在调用的时候需要使用对像名.实例成员调用(先要实例化,如person ps=new person();  ps. ...

  7. C# 静态类与非静态类、静态成员的区别分析

    静态类静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例化 ...

  8. 深入理解C# 静态类与非静态类、静态成员的区别 [转载]

    静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例 ...

  9. java静态类与非静态类区别

    java静态与非静态区别   这里的静态,指以static关键字修饰的,包括类,方法,块,字段. 非静态,指没有用static 修饰的. 静态有一些特点: 1.全局唯一,任何一次的修改都是全局性的影响 ...

随机推荐

  1. Ununtu 12.04 gedit安装插件Source Code Browser

    1. 安装ctags: sudo apt-get install exuberant-ctags 2. 打开https://github.com/Quixotix/gedit-source-code- ...

  2. [Angular 2] Understanding Pure & Impure pipe

    First, how to use a build in pipe: <div class="pipe-example"> <label>Uppercase ...

  3. android 退出整个程序

    上网学了好多方法,关于Android的Activity如何退出.好多方法都不行啦,试了各种方法,下面这种方法就是我最喜欢的,简单又容易懂. 使用单例模式创建一个Activity管理对象,该对象中有一个 ...

  4. java_redis3.0.3集群搭建

    redis3.0版本之后支持Cluster,具体介绍redis集群我就不多说,了解请看redis中文简介. 首先,直接访问redis.io官网,下载redis.tar.gz,现在版本3.0.3,我下面 ...

  5. 详解MySQL中EXPLAIN解释命令

    Explain 结果解读与实践   基于 MySQL 5.0.67 ,存储引擎 MyISAM .   注:单独一行的"%%"及"`"表示分隔内容,就象分开“第一 ...

  6. 深入分析 Linux 内核链表

    转载:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/   一. 链表数据结构简介 链表是一种常用的组织有序数据的数据结构,它通过指 ...

  7. 使用 collectionView 实现表头,区头,区尾

    UICollectionView 的使用是跟表的使用是一样,瀑布流的布局会比表的效果更好,这里说一下 collectionView 设置表头, 区头,区尾 设置表头可以约束 collectionVie ...

  8. iOS之上线被拒

    前言 感谢您付出宝贵的才华与时间来开发iOS应用程程序.从职业与报酬的角度而言,这对于成千上万的开发员来说一直都是一项值得投入的事业,我们希望帮助您加入这个成功的组织.我们发布了<App Sto ...

  9. CentOS(七)--Linux文件类型及目录配置

    这篇随笔将会对Linux系统的文件类型以及Linux的目录结构进行详细补充(linux中目录管理和权限非常重要,特别是在linux安装数据库类软件). 一.Linux更改文件权限的两种方式 在之前的一 ...

  10. Linux文件与目录管理之ls的使用

    来源:鸟哥的私房菜 查看文件与目录 ls ls [-aAdfFhilnrRSt] 目录名 ls [--color={never,auto,always}] ls [--full-time] 目录名 选 ...