C#静态方法和实例方法辨析和实例

开发 后端
在这里我们将讨论的是C#静态方法和实例方法,希望大家能辩证的看待这个问题。包括声明实例,调用实例方法;通过一个静态的实例,去调用实例方法等等。

本文将围绕c#静态方法和实例方法讨论一下。针对一些观点,如:"静态方法是常驻内存", 还有"静态方法比实例方法先装载",做一个辨析。同时讨论下何时用静态方法,何时用实例方法。

前几日,在微软的好友发给我一个链接:《静态方法和实例化方法之间的区别你知道了嘛? 欢迎讨论!! - 问题最终 ...》,然后说这里某些观点需要澄清一下,希望我写一篇blog。我当时读了这篇blog. 文比较短,列举了静态方法和实例方法的几种案例,也没有论点,然后就请大家讨论。后面评论就比blog热闹多了。言辞也激烈,后来该blog作者干脆把这篇blog删了。现在已经看不到这篇blog了。现在我写这篇blog,一是针对一些观点做个辨析,二是完成好友的所托。

c#静态方法和实例方法的几种用法

见如下代码:这三种形式我们应该都用过。

  1. public class SomeClass   
  2. {   
  3. private string myfield = null;   
  4. public static instance = new SomeClass();   
  5. public instranceMethod() {};   
  6. public static staticMethod() {};   
  7. }   
  8.  public class AnotherClass   
  9.  {   
  10.  public static Main()   
  11.    {   
  12.     //***种方式, 声明实例,调用实例方法   
  13.   SomeClass someClass = new SomeClass();   
  14.    someClass.instanceMethod();   
  15.  //第二种方式,通过一个静态的实例,去调用实例方法   
  16.   SomeClass.instance.instanceMethod();   
  17.  //第三种方式,直接调用静态方法   
  18.   SomeClass.staticMethod();   
  19.    }   
  20. }  

这几种方式在调用时间,还有线程安全,面向对象的编程方面都有差别。后文会谈到。

"静态方法是常驻内存"

这是那位blog作者在评论中给出的观点。我觉得"静态方法是常驻内存"的说法是不对的。要知道一个.NET类型的静态方法是属于这个.NET类型的。而这个.NET类型是一个.NET 程序集的一部分。这个.NET程序集是被一个AppDomain装入到内存里面来的。这个AppDomain是可以从内存卸载的。一个有.NET CLR的进程里面可以有多于一个的AppDomain,***个AppDomain之后的AppDomain都可以动态创建和卸载。这些AppDomain中的.NET程序集,既可以有静态方法,也可以有实例方法。不管是静态方法还是实例方法,都是随其程序集所在的AppDomain一起创建和卸载。***个AppDomain在整个程序运行结束时也会***被卸载。其中所含的.NET程序集自然也卸载。看图1会更明白点。所以静态方法不存在常驻内存一说。

图1

"静态方法比实例方法先装载"

这也是那篇blog的评论中某些人提出的观点。我不知道他们的论据是什么,但是我已经做过实验,而且也写过这两篇blog关于.NET反射和metadata加载--致Jeffray Zhao等几位和firelong和[继续讨论]关于Windows PE和.NET assembly的加载来证明.NET程序集的加载方式是整个地加载,而不是用到某个metadata才加载该metadata, 用到某个方法才加载该方法。因为静态方法和实例方法同属于一个.NET类型,而一个.NET类型属于一个.NET程序集。在整个地加载一个.NET程序集的时候,不管是静态方法还是实例方法,都随该程序集全部加载进内存。所以"静态方法比实例方法先装载"也是不成立的。

何时用静态方法,何时用实例方法

先说实例方法,当你给一个类写一个方法,如果该方法需要访问某个实例的成员变量时,那么就将该方法定义成实例方法。一类的实例通常有一些成员变量,其中含有该实例的状态信息。而该方法需要改变这些状态。那么该方法需要声明成实例方法。

静态方法正好相反,它不需要访问某个实例的成员变量,它不需要去改变某个实例的状态。我们把该方法定义成静态方法。

***种方式, 声明实例,调用实例方法

当一个类有多个实例,例如学生这个类,实例可以有学生甲,学生乙,学生丙,等等,我们就用***种方式。在多线程的情况下,只要每个线程都创建自己的实例,那么***种方法通常是线程安全的。

第二种方式,通过一个静态的实例,去调用实例方法

这种情况比较特殊,通常是整个程序里该类唯一的一个实例,我们通过调用该实例的实例方法来改变该实例的某些状态。这一个实例在多线程的情况下,通常是线程不安全的。除非我们给这个实例加锁。防止其他线程访问该实例。

第三种方式,直接调用静态方法

这种情况下静态方法不需要去改变某个实例的状态。只要得到少量的参数就可完成既定事情。比如判断一个文件是否存在,只要给个文件路径和文件名,就能知道该文件是否存在。

原文标题:关于c#静态方法和实例方法的辨析和应用

链接:http://www.cnblogs.com/mikelij/archive/2010/08/13/1798578.html

[[14295]]

【编辑推荐】

  1. C#模式窗体中的按钮操作
  2. C#模式窗体操作详解
  3. C#窗体继承原理以及实现浅析
  4. C#窗体关闭事件的重载实现浅析
  5. C#窗体位置与大小设置详解

责任编辑:彭凡 来源: 博客园
相关推荐

2009-08-28 12:47:30

C#静态方法应用

2009-08-28 12:31:06

C#静态方法

2009-08-31 09:41:05

C#反射静态方法开发

2009-08-24 16:08:45

C# DrawStri

2021-04-21 10:01:53

Python类方法静态方法

2015-07-09 10:44:48

C#WebService

2009-12-21 16:52:52

静态路由设置

2009-08-28 12:41:49

静态方法与非静态方法

2009-10-09 09:07:40

C#委托和事件

2009-08-27 16:00:03

C#静态字段C#实例字段

2009-08-31 16:01:28

C#水晶报表数据获取方

2009-08-12 16:38:35

C#读取XML节点

2009-08-04 16:58:21

C#线程BeginInvokeEndInvoke

2009-08-28 12:19:19

C#静态方法

2009-08-28 12:25:58

C#静态方法

2009-08-31 10:18:00

C#静态变量定义C#静态变量

2009-08-31 09:47:22

C#静态变量初始化

2009-08-21 10:28:21

C#异步方法C#同步方法

2009-08-28 16:37:32

C# for循环

2009-09-17 16:45:56

C#数组
点赞
收藏

51CTO技术栈公众号