静态方法和实例方法的关系与区别_第1页
静态方法和实例方法的关系与区别_第2页
静态方法和实例方法的关系与区别_第3页
静态方法和实例方法的关系与区别_第4页
静态方法和实例方法的关系与区别_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、静态方法C+中,若类的方法前加了 static关键字,则该方法称为静态方法,反之为实例 方法。静态方法为类所有,可以通过对象来使用,也可以通过类来使用。但一般 提倡通过类名来使用,因为静态方法只要定义了类,不必建立类的实例就可使用。 静态方法只能用类的静态成员。静态方法的定义若类的方法前加了 static关键字,则该方法称为静态方法,反之为非静 态方法。静态方法的使用静态方法与静态变量一样,属于类本身,而不属于那个类的一个对象。 要想调用一个被定义为static的方法,必须在它前面加上这个类的名称。实例方法必须通过类的实例来使用。实例方法可以使用类的非静态成员, 也可以使用类的静态成员。类的静

2、态方法,静态变量是在类装载的时候装载的。但是要特别注意, 类的静态变量是该类的对象所共有的,即是所有对象共享变量。所以建议尽 量少用静态变量。尽量在静态方法中使用内部变量。声明其中static关键字即表示静态的。声明静态方法的语法如下:访问修饰符 static返回类型 方法名(参数列表)/方法体调用静态方法与实例方法唯一不同的,就是静态方法在返回类型前加 static 关键字。静态方法的调用有两种途径:(1)通过类的实例对象去调用调用格式为:对象名.方法名(2)通过类名直接调用调用格式为:类名.方法名使用规则我们在使用时要注意:静态方法只能访问类的静态成员,不能访问类的非静态成员;非静态方法可

3、以访问类的静态成员,也可以访问类的非静态成员;静态方法既可以用实例来调用,也可以用类名来调用。代码示例using System;namespace TestStaticclass StaticTest int x; static int y;public StaticTest(int a, int b) x = a; y = b; public void SimplePrint() Console.WriteLine(x= + x +,y= + y); public static void StaticPrint()Console.WriteLine(y=0”, y);/ Console.Wr

4、iteLine(x=0”,x); /静态方法中不能使用非静态成员 class Teststatic void Main(string args)StaticTest st =new StaticTest(10, 23);st.SimplePrint();/st.StaticPrint(); /静态方法不能使用实例来调用 StaticTest.StaticPrint();实际应用有静态属性的类,一般会定义静态方法。没有属性的类,一般会定义静态方法,这样在使用时,通过类名:方 法名即可调用,而不用先定义对象,再调用,这样可以省去一行代码。静态方法经典案例(1)用于对静态字段、只读字段等的初始化。(

5、2)添加static关键字,不能添加访问修饰符,因为静态构造函数都是 私有的。(3)类的静态构造函数在给定应用程序域中至多执行一次:只有创建类 的实例或者引用类的任何静态成员才激发静态构造函数(4)静态构造函数是不可继承的,而且不能被直接调用。(5 )如果类中包含用来开始执行的 Main方法,则该类的静态构造函 数将在调用Main方法之前执行。任何带有初始值设定项的静态字段,则在 执行该类的静态构造函数时,先要按照文本顺序执行那些初始值设定项。(6)如果没有编写静态构造函数,而这时类中包含带有初始值设定的静 态字段,那么编译器会自动生成默认的静态构造函数。以下用例子代码进一步说明:using

6、System;class A public static int X; static A()执行完后返回到 X = B.Y + 1; Console.WriteLine(staticA()”); )class B public static int Y = A.X + 1 调用 了 A 的静态成员,转到 A 的静态构造函数- static B()如果带有初始值设定项的静态字段,执行该类的静态构造函数时,先要按照文本顺序执行那些初始值设定项。转到初始值设定项- Console.WriteLine(staticB()”); static void Main()程序入口,如果类中包含用来开始执行的

7、Main方法,该类的静态构造函数将在调用Main方法之前执行。转到 B 的静态构造函数- Console.WriteLine(X = 0,Y = 1, A.X, B.Y);输出结果 Console.ReadLineQ; 静态方法的弊端在一些系统中使用非常频繁的方法都使用静态方法可以提高系统性能 本身不可升级,重写,这要看一个软件产品的目的是什么了 .为了方便,不用实例化,但这样程序编译运行时就占用了系统资源静态的属性和方法在程序启动的时候,就全部装入内存的,而不管这些 方法、属性以后有没有用到。即使是没有人再访问程序,这部分内存仍然不 会释放还有就是,所有访问者看到的静态属性的数据几乎都是一样

8、的,比如 A用户设置了 UserName这个属性,B用户访问的时候,得到的UserName 仍然是A用户设置的那个。这种特性,如果用在固定数据中,那不会有太大 问题,比如连接字符串之类的静态方法/数据成员是属于类的,不是属于某一个对象的,因而调用它不 需要实例化;静态方法和静态数据成员相当于共享变量。为该类的所有对象 所共有,因而在需要共享数据时,定义这种类型时很好的选择。一但定义一 个类后(不一定要实例化对象)该类的所有静态成员就载入内存(并不是程序 启动,就装入内存,没有定义该类时它不会载入内存)静态成员的作用域与 它所属的类的作用域相同使用了 static修饰符的方法为静态方法,反之则是

9、非静态方法。下面我们分四个方面来看看C#静态方法与非静态方法的差异:C#静态方法与非静态方法比较一、C#静态成员:静态成员属于类所有,非静态成员属于类的实例所有。每创建一个类的实例,都会在内存中为非静态成员新分配一块存储;非静态成员属于类所有,为各个类的实例所公用,无论类创建了多少实例,类的静态成员在内存中只占同一块区域。C#静态方法与非静态方法比较二、C#静态方法1、C#静态方法属于类所有,类实例化前即可使用。2、非静态方法可以访问类中的任何成员,静态方法只能访问类中的静态成员。3、因为静态方法在类实例化前就可以使用,而类中的非静态变量必须在实例化 之后才能分配内存,这样,C#静态方法调用时

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

11、静态变量创建后始终使用同一块内存,而使用实例的方式会创建多 个内存.C#中的方法有两种:实例方法,静态方法.C#静方法与非静态方法比较四、C#静态方法中获取类的名称 静态方法中用:string className =System.Reflection.MethodBase.GetCurrentMethodQ.ReflectedType.FullName;非静态方法中还可以用:string className = this.GetType().FullName;C#静态方法与非静态方法的区别解析旨在诠释C#静态方法的含义,希望对你了 解和学习C#静态方法与非静态方法有所帮助。观点1:这是一个经常

12、被时时提出来的问题,很多时候我们以为理解了、懂了,但深究一 下,我们却发现并不懂。方法是我们每天都在写得,很多程序员大多都使用实例化方法,而很少使用静态 方法,问原因也说不出来所以然,或者简单的回答两者定义的区别,静态方法不 需要new就可以使用实例化方法需要new 了以后才可以使用。我们真 的理解了吗?从实际项目开发说起,这里有开发项目的三种方式:开发项目中把BLL和DAL分开,在BLL调用DAL的代码。一、在DAL中使用静态方法,不创建实例直接调用(大概有很多人都使用这种 方式开发)class DAL(public static string GetUserName(.);在BLL中调用:

13、DAL.GetUserNameQ;二、在DAL中使用实例方法,采用静态成员模式(或Singleton)通过实例来调用: class DAL(public static readonly DAL dal = new DALQ;public string GetUserName(.);在BLL中调用:DAL.dal.GetUserNameQ;三、在DAL中使用实例方法,每次调用之前先创建DAL对象的实例:class DAL(public string GetUserName(.);在BLL中调用:DAL dal = new DAL();dal.GetUserName();开发方式一:我以为在一些情

14、况下(比如 调用多个数据库、GetUserName(.) 内部处理操作部分)会出现线程安全的嫌疑。这种开发方式不用New出对象, 所以很普遍。开发方式二:应该多是应用在cs模式下,DAL在整个项目只会有一个对象存在, 如果出现在B/S我想不能兼容多种问题情况。而且也有线程安全的问题。开发方式三:应该是普遍使用的,能够兼容各种问题,也不会有线程不安全的嫌 疑出现。特别说明一下:在MS的pet3.0以前的版本 都采用了方式二,而到pet3.0和以 后的版本 都采用了方式三,而且特别在开发说明文档中明确的解释了一下。我 想应该是从兼容性上考虑的,从性能上方式二并不比方式三真正的高多少。观点2:最大的

15、区别在于内存。静态方法在程序开始时生成内存,实例方法在程序运 行中生成内存,所以静态方法可以直接调用,实例方法要先成生实例,通过实例调 用方法,静态速度很快,但是多了会占内存。任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题, 底层都是一样的,只是实现方法不同。静态内存是连续的,因为是在程序开始时就 生成了,而实例申请的是离散的空间,所以当然没有静态方法快,而且静态内存是 有限制的,太多了程序会启动不了。总结:大家对这个问题都有一个共识:那就是实例化方法更多被使用和稳妥,静态方法 少使用。如果从线程安全、性能、兼容性上来看也是选用实例化方法为宜。补充内容:静态成员与非静态成员比较:静态成员属于类所有,非静态成员属于类的实例所有。每创建一个类的实例,都会在内存中为非静态成员新分配一块存储;非静态成员属于类所有,为各个类的实例所公用,无论类创建了多少实例,类的静态成员在内存中只占同一块区域。静态方法与非静态方法:1、静态方法属于类所有

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论