c#_static静态

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

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

比较一、C#静态成员:

静态成员属于类所有,非静态成员属于类的实例所有

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

比较二、C#静态方法

C#静态方法属于类所有,类实例化前即可使用。

非静态方法可以访问类中的任何成员,静态方法只能访问类中的静态成员。因为静态方法在类实例化前就可以使用,而类中的非静态变量必须在实例化之后才能分配内存,这样,C#静态方法调用时无法判断非静态变量使用的内存地址。所以无法使用。而静态变量的地址对类来说是固定的,故可以使用。

比较三、C#静态方法是一种特殊的成员方法

它不属于类的某一个具体的实例,而是属于类本身。所以对静态方法不需要首先创建一个类的实例,而是采用类名.静态方法的格式 。

static内部只能出现static变量和其他static方法!而且static方法中还不能使用this....等关键字..因为它是属于整个类!

静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。

静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存。

比较四、C#静态方法中获取类的名称

静态方法中用:

string className =   System.Reflection.MethodBase. GetCurrentMethod().ReflectedType.FullName; 

非静态方法中还可以用:

string className = this.GetType().FullName; 
使用静态得准则就是:1.保证不会产生并发。2. 在方便快捷和开发难度上做一个衡量

 

******--------------------------------*********--------------------------------******

那么C#什么时候该使用静态类呢?

判断这个很简单,就是从内存的优化方面去考虑.因为静态和非静态的不同的地方,就是静态的从程序一启动就会一直占用内存,而非静态的只在使用后(实例化)后才会占用内存.但是每实例化个一个对象时又会另外占用内存. 举个例子,比如说一个数据库的连接字段(STRING).因为要经常使用到它,这时我们可以用STATIC.但是如果这时用非静态的话那就不合算了,因为每次调用到它时,又实例化一次.这样相比来说占用内存就比较大了.不划算.  像一个登录后台的方法,你只在登陆时候调用一次,就没有必要做成静态的了.那样一直驻存在内存中.在大型项目中,你如果都使用静态的那得要多少内存去支撑呀.

总之就是它经常要被调用时,就用静态的.相反则用非静态的.

******--------------------------------*********--------------------------------******

 

再者,说一下C#静态字段的两个用处

静态字段的2个常用方法

(1)记录已实例化的对象的个数

(2)存储必须在所有实例化之间共享的值

  

  (1)记录已实例化的对象的个数

现在某个培训机构啊,要开设一个学理发的班,计划招5人,只要人数够5人就开班。

但是这个学生是一个一个来的,不可能一下子就把5个人招满了。

那么招第一个人,学生总数就是1,再招两个人,那学生总数就是3了,也就是说学生总人数是变化的,这个学生总数就需要声明为静态字段,因为静态字段实例化只会在内存里使用同一块区域(只不过存储的值变化罢了)。如果声明为实例成员,那就麻烦了,需要开辟5个内存空间,尼玛真有钱啊!

 

 

(2)存储必须在所有实例化之间共享的值

现在开班了,班里老师只有一个,叫唐僧。班里的五个人都知道老师叫唐僧(也就是说老师这个字段是共享的 哦)。但是某一天唐僧要去女儿国走丈母娘家了,课不能停呀。所以就请观音姐姐过来带一段课。

现在5个学生都知道 老师换成 观音姐姐了,都很激动哈。但是她们是怎么都知道换老师的呢?还是这个静态字段的功劳,将 老师姓名声明为静态字段,这个字段是共享的。所以该类的属性都能知道。

废话不多说,直接上代码;

 

 

 

补充——使用const关键字创建静态字段:

用const关键字声明的字段称为常亮字段,是一种特殊的静态字段,它是永远不能改变的。关键字const是constant常量的简称,const字段虽然也是静态字段,但是不用static关键字,只有数字类型、字符串类型和枚举类型的字段才能声明为const字段。例如Math类中的PI就被声明成了Const字段。

  • 9
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值