静态方法与非静态方法的区别

lanzclan 2010-09-27 10:19:23
实例方法比静态方法多传递一个隐含的指针参数,该指针指向该方法所从属的已被实例化的对象。这一区别的外在表现为实例方法内可使用this关键字代表所从属的实例对象,而静态方法不可使用this因为静态方法不针对任何实例对象。实例对象调用静态方法会因参数中多出一个指向自己的指针(this)而发生错误。 定义静态方法只需加注static关键字即可。静态方法独立于对象实例之外,与对象是否已被实例化无关,调用静态方法要用类定义的名称而不能用实例名称如: class a { ... public static void b(){}//静态方法 public void d(){}//实例方法 } a c = new a(); a.b();//正确的调用方式,与对象实例无关。 a.d();//错误的调用方式。 c.b();//错误的调用方式。 c.d();//正确的调用方式,隐含this指针,不需要也不允许显式传入对象指针。
还有一个疑问:
静态与非静态的存在之区别在调用方法的不同吗?在编程的时候有没有各自存在的优势呢?例如有的时候用非静态方法较好。

...全文
252 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zuisha8 2010-09-27
  • 打赏
  • 举报
回复
前面已经回答的差不多了
jointan 2010-09-27
  • 打赏
  • 举报
回复
如果需要给一个DllImport的函数传一个回调函数时(委托实现),必须用static,当然你传一个普通方法也可以,不会报错,但GC在特定的时间,可能会析构掉这个普通方法所实现的类,导致发生问题,用static不会出现这种问题.不信你可以试试,在把一个委托包装好的非静态方法传入一个非托管DLL,然后调用一下GC.Collect.

这种必须,也许是static必须存在的一个理由

还有,你可以跟踪一下静态构造函数,如果该类静态方法不被调用,也未创建任何该类的实例,该类的静态构造函数不被调用,所以静态方法,比用一个非静态全局类(系统启动时就被创建,能被访问到即可),要节省资源.
wuyq11 2010-09-27
  • 打赏
  • 举报
回复
静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别。
静态方法不用创建实例就可调用,比较简单从面向对象的角度上来说,在抉择使用实例化方法或静态方法时,应该根据是否该方法和实例化对象具有逻辑上的相关性,如果是就应该使用实例化对象 反之使用静态方法。这只是从面向对象角度上来说的。
如果从线程安全、性能、兼容性上来看 也是选用实例化方法为宜。
bloodish 2010-09-27
  • 打赏
  • 举报
回复
调用静态方法,通过ClassName.Function();
调用非静态类方法,需要有该类的实例对象,通过ClassInstance.Function();
静态方法一般跟实例对象无关,如果需要在方法内用到实例对象,可以将实例对象按参数传递.
属于对象本身的行为,我们一般抽象成非静态的方法,表示对象可以执行某个操作.
兔子-顾问 2010-09-27
  • 打赏
  • 举报
回复
原理性的你已经明白了。不错。
静态非静态的如果你真想所有的都写静态方法,每次传参数没人拦着。非静态的不过是一种简单写法,因为定然是操作类成员变量的,没必要每次传递一个引用。所以可以写非静态方法。就像你,可以定义一个类:人,定义一个静态方法:呼吸,然后每次调用

呼吸(人对象1);
呼吸(人对象2);

也可以写非静态的。

人对象1.呼吸();
人对象2.呼吸();

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧