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

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

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. Eclipse下如何导入jar包【转载】

    我们在用Eclipse开发程序的时候,经常想要用到第三方的jar包.这时候我们就需要在相应的工程下面导入这个jar包.以下配图说明导入jar包的步骤. 1.右击工程的根目录,点击Properties进 ...

  2. [OSG]如何用Shader得到物体的世界坐标

    来自:http://www.cnblogs.com/hesicong/archive/2008/05/27/1208312.html 最近群里面有个朋友问我关于如何得到OpenGL世界坐标的问题,当时 ...

  3. UWSGI安装与使用

    http://blog.csdn.net/chenggong2dm/article/details/43937433 http://blog.csdn.net/orangleliu/article/d ...

  4. 第1章 游戏之乐——NIM(2)“拈”游戏分析

    NIM(2)“拈”游戏分析 1. 问题 有N块石头和两个玩家A和B,玩家A先将石头分成若干堆,然后按照BABA……的顺序不断轮流取石头,能将剩下的石头一次取光的玩家获胜.每次取石头时,每个玩家只能从若 ...

  5. discuz2.0升级后不能自动跳转问题

    /static/js/admincp.js文件有问题,重新覆盖,在后台:运营->更新缓存就ok了

  6. 谷歌chrome浏览器桌面提醒 webkitNotifications

    原创: //点击时开启提醒 $(".message_alert").toggle(function(){ $(".message_alert_tip").htm ...

  7. python中文处理之encode/decode函数

    python中文处理相信迷惑过不少同学.下面说说python2/3的encode和decode函数. python2中,使用decode()和encode()来进行解码和编码,以unicode类型作为 ...

  8. android开发之路06(浅谈单例设计模式)

    设计模式之单例模式: 一.单例模式实现特点:①单例类在整个应用程序中只能有一个实例(通过私有无参构造器实现):②单例类必须自己创建这个实例并且可供其他对象访问(通过静态公开的访问权限修饰的getIns ...

  9. CSS code snip enjoy.

    <!-- information-total得是动态获取吧. --> <div class="information-mod"> <div class ...

  10. zlib导致Ubuntu登录管理器失效

    ubuntu版本:10.04 现象:开机之后无法启动登录管理器. 原因:zlib与登录管理器冲突. 解决:卸载zlib.