C#中的静态成员和非静态成员
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#中的静态成员和非静态成员的更多相关文章
- C++静态成员和非静态成员的区别和使用
C++静态成员和非静态成员的区别和使用 对象与对象之间的成员变量是相互独立的.要想共用数据,则需要使用静态成员和静态方法. 只要在类中声明静态成员变量,即使不定义对象,也可以为静态成员变量分配空间,进 ...
- C#静态成员和非静态成员
一.C#静态成员和非静态成员 1. C#静态成员和非静态成员 当类中的某个成员使用static修饰符时,就会被声明为静态成员.类中的成员要么是静态成员,要么是非静态成员.一般情况下,静态成员属于整个类 ...
- java字段中初始化的规律与如何用静态成员函数调用非静态成员
java字段中初始化的规律: 执行以下代码,出现的结果是什么? class InitializeBlockClass{ { field=200; } public int field=100; pub ...
- c++ 类静态成员、非静态成员初始化
1.静态成员初始化(不能在构造函数或初始化列表中初始化) 1.1 所有静态成员都可以在类定义之外初始化(通用),如下所示 class test { public: static int a; }; ; ...
- C#面向对象中类的静态成员与非静态成员的区别
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- PHP静态成员变量和非静态成员变量
数据成员可以分静态变量.非静态变量两种. 静态成员: 静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会 ...
- C++类中的静态成员变量和静态成员函数的作用
数据成员可以分为静态变量.非静态变量两种. 静态成员:静态类中的成员加入static 修饰符,即是静态成员,可以使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配 ...
- 深入浅出C#中的静态与非静态
C#语言静态类 vs 普通类 C#语言静态类与普通类的区别有以下几点: 1)C#语言静态类无法实例化而普通类可以: 2)C#语言静态类只能从System.Object基类继承:普通可以继承其它任何非 ...
- C++ 类的静态成员变量及静态成员函数
ps:下面所说 成员=成员变量+成员函数: 作用 由于对象与对象之间的成员变量是相互独立的.所以要想共用数据,则需要使用静态成员和静态函数. 空间分配 静态成员是在程序编译时分配空间,而在程序结束时释 ...
随机推荐
- Redhat 5上OPENLDAP的安装备份和恢复
1. 安装 1.1. 安装环境 查看当前操作系统版本: [root@vmw9181-app ~]# cat /etc/issue Red Hat Enterprise Linux Server rel ...
- MySQL Windows版安装详解
一.下载MySQL MySQL官网https://dev.mysql.com提供了Windows下的安装版msi和解压版zip,其中均包含32和64位版本,mis版本与SqlServer安装基本一致N ...
- c#中list使用示例
protected void Page_Load(object sender, EventArgs e) { List<string> studentNames = new List< ...
- Hibernate 学习笔记 - 2
五.映射一对多关联关系 1. 单向多对一 即 单向 n-1 1)单向 n-1 关联只需从 n 的一端可以访问 1 的一端 ① 域模型: 从 Order 到 Customer 的多对一单向关联需要在Or ...
- 搭建Hadoop平台(新手入门)
刚刚大学毕业,接触大数据有一年的时间了,把自己的一些学习笔记分享给大家,希望同热爱大数据的伙伴们一起学习,成长! 资料准备: Hadoop-2.7.1下载:http://pan.baidu.com/s ...
- Django REST FrameWork中文教程2:请求和响应
从这一点开始,我们将真正开始覆盖REST框架的核心.我们来介绍几个基本的构建块. 请求对象REST框架引入了Request扩展常规的对象HttpRequest,并提供更灵活的请求解析.Request对 ...
- C语言第一次实验报告————PTA实验1.2.3内容
一.PTA实验作业 题目1.温度转换 本题要求编写程序,计算华氏温度100°F对应的摄氏温度.计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型. 1.实验代 ...
- win10 uwp 反射
本文在h神的指导下完成. 反射是强大的好用的,我们可以添加新功能不修改之前的代码,通过使用反射得到. 本文下面和大家说如何做一个和WPF一样的反射功能,如何才能获的 UWP 程序集所有类. 先来说下反 ...
- Android基础知识04—Activity活动之间传递数据
------活动之间传递数据------ 向下一个活动传递数据: Intent中提供了一系列的putExtra()方法,可以把数据暂存到Intent中,启动另一个活动的时候就可以取出来. 代码: (存 ...
- uva 10118,记忆化搜索
这个题debug了长达3个小时,acm我不能放弃,我又回来了的第一题! 一开始思路正确,写法不行,结果越改越乱 看了网上某神的代码,学习了一下 coding+debug:4小时左右,记忆化搜索+dp类 ...