C#的类中可以包含两种方法:C#静态方法与非静态方法。那么他们的定义有什么不同呢?他们在使用上会有什么不同呢?

让我们来看看最直观的差别:使用了static 修饰符的方法为静态方法,反之则是非静态方法。

下面我们分四个方面来看看C#静态方法与非静态方法的差异:

C#静态方法与非静态方法比较一、
C#静态成员: 
①静态成员属于类所有,非静态成员属于类的实例所有。 
②每创建一个类的实例,都会在内存中为非静态成员新分配一块存储;

静态成员属于类所有,为各个类的实例所公用,无论类创建了多少实例,类的静态成员在内存中只占同一块区域。

C#静态方法与非静态方法比较二、
C#静态方法 
1、C#静态方法属于类所有,类实例化前即可使用。 
2、非静态方法可以访问类中的任何成员,静态方法只能访问类中的静态成员。 
3、因为静态方法在类实例化前就可以使用,而类中的非静态变量必须在实例化之后才能分配内存,

这样,C#静态方法调用时无法判断非静态变量使用的内存地址。所以无法使用。而静态变量的地址对类来说是固定的,故可以使用。

C#静态方法与非静态方法比较三、
C#静态方法是一种特殊的成员方法 它不属于类的某一个具体的实例,而是属于类本身。所以对静态方法不需要首先创建一个类的实例,而是采用类名.静态方法的格式 。 
1.static方法是类中的一个成员方法,属于整个类,即不用创建任何对象也可以直接调用! 
static内部只能出现static变量和其他static方法!而且static方法中还不能使用this....等关键字..因为它是属于整个类! 
2.静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。 
3.静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存. 
4.C#中的方法有两种:实例方法,静态方法.

C#静态方法与非静态方法比较四、
C#静态方法中获取类的名称 
静态方法中用: 
string className =   System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName;

非静态方法中还可以用: 
string className = this.GetType().FullName;

C#静态方法与非静态方法的区别解析旨在诠释C#静态方法的含义。

--------------------------------------------------------------------------------------------------------------

数据成员

数据成员可以分静态变量、实例变量两种.
静态成员:静态成员变量是和类相关联的,可以作为类中"共"有的变量(是一个共性的表现),他不依赖特定对象的存在,访问的时候通过类名加点操作符加变量名来访问.
实例成员:实例成员变量是和对象相关联的,访问实例成员变量依赖于实例的存在.

函数成员

方法可以主要分为静态方法,实例方法
静态方法:静态方法是不属于特定对象的方法,静态方法可以访问静态成员变量,静态方法不可以直接访问实例变量,可以在实例函数调用的情况下,实例变量做为参数传给静态方法。静态方法也不能直接调用实例方法,可以间接调用,首先要创建一个类的实例,然后通过这一特定对象来调用静态方法。
实例方法:一个实例方法的执行与特定对象关联,他的执行需要一个对象存在。实例方法可以直接访问静态变量和实例变量,实例方法可以直接访问实例方法、和静态方法,静态方法的访问方式为类名加点操作符加变量名。当多个实例对象存在时,内存中并不是存在美个特定的实例方法的拷贝,而是,相同类的所有对象都共享每个实例方法的一个拷贝(实例方法只占用“一套”空间)。

静态的东西,在构造的时候是在堆中生成,在结束前不会被释放与改变.
大量的数据访问 由于已经生成且不被释放,所以就不会在栈中反复创建实例,节约空间时间。
非静态的反复调用方法 有可能造成使用过的变量或方法被系统回收,而再创建的问题。
对于大数据量的访问操作,应该使用静态方法,可以提高性能。
如果一个方法不需要实例就能很好的运行,那它本来就该是静态的,除非是你故意把它写成非静态的,所以这个效率是无稽之谈。

静态方法的使用场合

一、该方法与任何实例无关。
二、该方法与特定实例无关。
三、该方法是运算符。
四、该方法不修改实例。
不过,除了第一条和第三条是亘古不变的之外,第二第四都是见仁见智的了。

关于静态方法

1、static声明的变量和方法会被放到内存的堆区,即使不调用也会被分配空间,而非static情况只有在使用的时候才被分配空间,使用完就释放掉。
2、static不需要你创建一个实例就可以调用。

当一个类的成员被声明为static时,它可以在这个类的对象被创建之前且没有任何对象的引用存在时被访问。因此,static成员多数被用于全局目的。可以将方法和变量都声明为static。当载入一个类时,一个又一个static块只执行一次。也就是说一些比较通用在系统中应用的比较广泛的函数,一般是采用静态方法。而不太通用的函数则可以使用非静态方法,因为在系统中使用的不是很多,不象通用函数那么广泛。实例化反而比静态方法更适合一些,它实例化所消耗的资源就可能比静态方法消耗的资源要少一些。所以一般都是根据实际需求来决定是否采用静态方法。

===================================================

用C#写程序,或者用一门oo语言写程序,你首先应该分清楚什么时候用静态函数,什么时候需要用成员函数。
如果不加区分,抛弃了oo意义,只是为了少许的提升性能的话,那么我建议你别用c#了,用C写,你获得性能提高会更多,可以说不是一个数量级的。

其次,就静态函数与静态成员的内存消耗、所带来的性能提高,以及由哪些危害,我大致提一下。
对于内存消耗来说,一般看似只有静态成员会消耗,而静态函数不会。
但是调用一个类的静态函数,类的静态成员如果没有初始化的话,是需要初始化的,也就是说静态函数的调用会对静态成员进行初始化,也就是潜移默化的造成内存损耗。
对于性能提高而言,
首先说说静态函数的调用,大致形式如下:
类名.方法名
调用步骤大致如下
1、通过类名找到类型table
2、通过类型table找到要调的函数指针,进行调用。
而对于成员函数,大致形式如下:
对象名.方法名
调用步骤大致如下
1、通过对象名找到类型table地址
2、通过类型table地址找到类型table
3、通过类型table找到要调的函数指针,进行调用。
也就是说调用成员函数要比静态函数多调用一个步骤,这里可以说是成员函数的性能不如静态函数的地方。

最后说说纯粹为了性能,而滥用静态函数的危害。
就像我前面举例的那样,不要为了静态函数而用静态函数,而大量产生如下的形式
public   class   UglyClass
{
        public   static   void   UglyMethod(   UglyClass   data   );
}
再说危害之前,首先说说静态函数所能访问到的数据,大致有两种
1、静态成员;
2、参数;
如果使用静态成员来传递数据的话,这你就要小心了,尤其是多线程的操作时候,操作不好的时候会产生相互干扰,而且这种问题你很难查出来。
如果使用参数来作为传递数据的方法,
首先参数列表显得臃肿,把本来不该传进的进行传递;
其次参数的读写操作,和静态成员一样,多线程操作的时候,也会出现相互干扰。
而这些在静态函数所产生的潜在危害,对于类的成员函数来说,可以最大的避免。

---------------------------------------------------------------------------------------------------------------

静态方法,静态类,静态成员,静态变量,静态字段都属于静态成员,static声明的变量和方法会被放到内存的堆上,即使不调用也会分配内存空间,而非静态成变量,只有在使用时才会分配内存空间,使用完就释放掉。

当一个类的成员被声明为静态时,该类的成员是在没有被实例化之前或在没有任何对象被引用之前使用;也就是说静态成员不需要去创建一个实例,就可以直接调用,这种静态成员通常适用于全局成员变量,从而不用在广泛调用的时候多次去创建实例,当然使用静态成员也有一些优点和缺点,静态成员,方法等不需要创建实例便可以调用,但破坏了一些属性的封装,使得安全性降低。

静态成员是当程序运行开始,相关类一加载时,就为静态成员在内存的堆上分配内存空间,

而非静态成员也就是实例成员、属性只有当对象被实例的时候才会为这些属性分配内存空间,使用过程中占用的内存会随着实例的创建逐步增加。实例成员通常用于一些不太常用的方法,函数。

------------------------------------------------------------------------

C#中的静态成员和非静态成员的更多相关文章

  1. C++静态成员和非静态成员的区别和使用

    C++静态成员和非静态成员的区别和使用 对象与对象之间的成员变量是相互独立的.要想共用数据,则需要使用静态成员和静态方法. 只要在类中声明静态成员变量,即使不定义对象,也可以为静态成员变量分配空间,进 ...

  2. C#静态成员和非静态成员

    一.C#静态成员和非静态成员 1. C#静态成员和非静态成员 当类中的某个成员使用static修饰符时,就会被声明为静态成员.类中的成员要么是静态成员,要么是非静态成员.一般情况下,静态成员属于整个类 ...

  3. java字段中初始化的规律与如何用静态成员函数调用非静态成员

    java字段中初始化的规律: 执行以下代码,出现的结果是什么? class InitializeBlockClass{ { field=200; } public int field=100; pub ...

  4. c++ 类静态成员、非静态成员初始化

    1.静态成员初始化(不能在构造函数或初始化列表中初始化) 1.1 所有静态成员都可以在类定义之外初始化(通用),如下所示 class test { public: static int a; }; ; ...

  5. C#面向对象中类的静态成员与非静态成员的区别

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. PHP静态成员变量和非静态成员变量

    数据成员可以分静态变量.非静态变量两种. 静态成员: 静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会 ...

  7. C++类中的静态成员变量和静态成员函数的作用

    数据成员可以分为静态变量.非静态变量两种. 静态成员:静态类中的成员加入static 修饰符,即是静态成员,可以使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配 ...

  8. 深入浅出C#中的静态与非静态

    C#语言静态类 vs 普通类  C#语言静态类与普通类的区别有以下几点: 1)C#语言静态类无法实例化而普通类可以: 2)C#语言静态类只能从System.Object基类继承:普通可以继承其它任何非 ...

  9. C++ 类的静态成员变量及静态成员函数

    ps:下面所说 成员=成员变量+成员函数: 作用 由于对象与对象之间的成员变量是相互独立的.所以要想共用数据,则需要使用静态成员和静态函数. 空间分配 静态成员是在程序编译时分配空间,而在程序结束时释 ...

随机推荐

  1. JS判断访问设备是移动设备还是pc

    <scripttype="text/javascript"> function browserRedirect() { var sUserAgent= navigato ...

  2. 【转】NAS 黑群晖 配置完成(不含硬盘),NAS能做什么?

    在配黑群晖前,240元入手过一个艾美佳的NAS感受了下,功能倒还合适,就是配置太老,厂家固件也停止更新了,一直不太满意. 后来经常关注NAS1,发现现在X86的NAS也很好自己DIY了,就长草了,向女 ...

  3. zoj3954 详细讲解 排序比较单词法

    Seven-Segment Display Time Limit: 1 Second      Memory Limit:65536 KB A seven segment display, or se ...

  4. elasticsearch高级组合查询ava

    /**     * 高级检索(组合条件检索)must相当于sql and操作     * @param modelType 0为模糊查询,1为精确查询     * @param index 索引   ...

  5. Windows环境部署并调试pyspark(一)

    准备: windows环境说明:Python2.7 + pipspark版本:spark-1.6.1-bin-hadoop2.6 step1: 下载并解压tar包到自定义的路径.(下载链接 https ...

  6. win10 uwp 绘图 Line 控件使用

    本文主要讲一个在绘图中,我们会有一个基础的控件,Line.控件的基本使用和他能做出的我们很多时候需要的界面. 虽然是一个简单控件,但是可以做出很诡异的很好看的UI. 首先,我们要知道,Line就是画直 ...

  7. Java基础-Eclipse环境搭建(02)

    Eclipse工具 IDE(Integrated Development Environment)集成开发环境集成了编写功能,分析功能,编译功能一体化的开发软件. 调试功能等,其中编译在保存时运行(即 ...

  8. LeetCode 66. Plus One(加1)

    Given a non-negative integer represented as a non-empty array of digits, plus one to the integer. Yo ...

  9. LeetCode 53. Maximum Subarray(最大的子数组)

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  10. 微信公众号支付|微信H5支付|微信扫码支付|小程序支付|APP微信支付解决方案总结

    最近负责的一些项目开发,都用到了微信支付(微信公众号支付.微信H5支付.微信扫码支付.APP微信支付).在开发的过程中,在调试支付的过程中,或多或少都遇到了一些问题,今天总结下,分享,留存. 先说注意 ...