C Static的一些理解

C Static的一些理解C 对于 Static 的理解 静态与实例的一些对比及用法 c static

大家好,欢迎来到IT知识分享网。

静态类

1、静态类的主要特性:

2、静态类与私有构造函数区别:

静态成员

静态方法

静态构造函数

class Program { 
    public static int i =0; public Program() { 
    i = 1; Console.Write("实例构造方法被调用"); } static Program() { 
    i = 2; Console.Write("静态构造函数被执行"); } static void Main(string[] args) { 
    Console.Write(Program.i);//结果为2,首先,类被加载,所有的静态成员被创建在静态存储区,i=0,接着调用了类的成员,这时候静态构造函数就会被调用,i=2 Program p = new Program(); Console.Write(Program.i);//结果为1,实力化后,调用了实例构造函数,i=1,因为静态构造函数只执行一次,所以不会再执行。 } } 

静态成员的存储

使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员static修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或类以外的类型。 

静态全局变量
  定义:在全局变量前,加上关键字 static 该变量就被定义成为了一个静态全局变量。
  特点:该变量在全局数据区分配内存,初始化时如果不显式初始化,那么将被隐式初始化为0。
  静态局部变量
  定义:在局部变量前加上static关键字时,就定义了静态局部变量。
  特点:该变量在全局数据区分配内存,初始化时如果不显式初始化,那么将被隐式初始化为0。它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。
  静态数据成员
  特点:内存分配时,在程序的全局数据区分配。初始化和定义时,静态数据成员定义时要分配空间,所以不能在类声明中定义为了避免在多个使用该类的源文件中,对其重复定义,所在,不能在类的头文件中定义。静态数据成员因为程序一开始运行就必需存在,所以其初始化的最佳位置在类的内部实现。   
对于public,protected,private 关键字的影响它和普通数据成员一样m因为其空间在全局数据区分配,属于所有本类的对象共享,所以,它不属于特定的类对象,在没产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它。访问形式 :类对象名.静态数据成员名.
静态数据成员,主要用在类的所有实例都拥有的属性上。比如,对于一个存款类,帐号相对于每个实例都是不同的,但每个实例的利息是相同的。所以,应该把利息设为存款类的静态数据成员。这有两个好处,第一,不管定义多少个存款类对象,利息数据成员都共享分配在全局区的内存,所以节省存贮空间。第二,一旦利息需要改变时,只要改变一次,则所有存款类对象的利息全改变过来了,因为它们实际上是共用一个东西。








静态成员函数
  特点:静态成员函数与类相联系,不与类的对象相联系。静态成员函数不能访问非静态数据成员。原因很简单,非静态数据成员属于特定的类实例。主要用于对静态数据成员的操作。
调用形式: 类对象名.静态成员函数名()

class Program { 
    static int i = getNum(); int j = getNum(); static int num = 1; static int getNum() { 
    return num; } static void Main(string[] args) { 
    Console.WriteLine("i={0}", i); Console.WriteLine("j={0}", new Program().j); Console.Read(); } } 

数据成员

数据成员可以分静态变量、非静态变量两种

 静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员。 静态成员存在于内存,而非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员,因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员. 非成静态员:所有没有加Static的成员都是非静态成员,当类被实例化之后,可以通过实例化的类名进行访问。非静态成员的生存期决定于该类的生存期,而静态成员则不存在生存期的概念,因为静态成员始终驻留在内容中。 
 static int id = 0; sql = "select * from table where id=" + id; 

关于静态方法和实例方法的一些误区。

一、 静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存。

 事实上,方法都是一样的,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别。 

二、 静态方法在堆上分配内存,实例方法在堆栈上。

 事实上所有的方法都不可能在堆或者堆栈上分配内存,方法作为代码是被加载到特殊的代码内存区域,这个内存区域是不可写的。 

三、 实例方法需要先创建实例才可以调用,比较麻烦,静态方法不用,比较简单。

 事实上如果一个方法与他所在类型的实例无关,那么它就应该是静态的,决不会有人把它写成实例方法。所以所有的实例方法都与实例有关,既然与实例有关,那么创建实例就是必然的步骤,没有麻烦简单一说。实际上上你可以把所有的实例方法都写成静态的,将实例作为参数传入即可。 有些方法看似与所在的实例无关,如IComparer.Compare方法,但实际上每一个实现这个接口的类都只会负责自己类型实例的比较,这是C#1.x规范中没有泛型所带来的历史遗留问题。 大部分静态方法是与类的实例有关的,如各种Parse方法,他做成静态的原因是他没有实例作为参数。其他的大多是出于语义或者其他目的的考虑。 

静态方法的使用场合

关于静态方法

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

静态函数与静态成员内存消耗

一般看似只有静态成员会消耗,而静态函数不会。但是调用一个类的静态函数,类的静态成员如果没有初始化的话,是需要初始化的,也就是说静态函数的调用会对静态成员进行初始化,也就是潜移默化的造成内存损耗。 

静态函数的调用过程

成员函数的调用过程下:

全局变量的危害:

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/118171.html

(0)
上一篇 2025-11-15 10:33
下一篇 2025-11-15 11:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信