静态方法和动态方法的使用场合?

huxiaoiqing0007 2011-11-22 01:11:24
正在学习采用三层架构做程序,有个问题想请教:model层用来传参数; dal用来操作数据库; bll层调用dal层的方法。bll层调用dal层方法时需要生成对应类的实例。窗口中调用bll方法的时候,要实例化一个bll的类。如是dal和 bll类里的方法都定义成静态的,不就用类名直接调用了吗,比每次都实例化要省事些吧?
PS:我知道静态属性只有一份,不同类的属性可能不一样,所以不能用静态的,但是方法用静态的应该不存在这个问题吧?
...全文
296 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xixihaha_2011_098 2011-11-23
  • 打赏
  • 举报
回复
项目不是很大,暂时按照自己的理解去做。自己觉得没区别。那就用静态或者动态。不必太在意理论。实现需求就可以。也许,现在经验不足。做低效率或者无用功,下一个项目就可以避免。这就是项目经验。
huxiaoiqing0007 2011-11-23
  • 打赏
  • 举报
回复
感谢!谢谢!看来自己闷头学还不行,还要多交流。分数有限,就按回答的先后给分吧,还请见谅!
  • 打赏
  • 举报
回复
楼上很多回复都已经说了,对于工程设计没有需求、只是纠结在语法是否“方便”上,这不能怪你。只能怪你的老师没有带你去做几个实际的复杂的分析实例。要知道需求是千变万化的,软件需要不断扩展、不断重构、不断用新的东西装旧的内容才能翻新。
  • 打赏
  • 举报
回复
编程不重要,它又很混乱的做法。所以看人的能力要看设计,而不是看编程。

而设计,就要看它是否具有基本的扩展性。比如在必要时,它就能继承和多态(而不是什么封装和分类),现在就能够按照接口(或者父类、抽象类,随便你用什么术语,意思基本上一样)来实现这种扩展性。最终,这种设计是直接等同于应用领域概念,而不是计算机概念。
缪军 2011-11-22
  • 打赏
  • 举报
回复
你可以看看有关接口或者多态的知识
但是要真正理解恐怕还是需要实践积累,

就你的问题,你要以面向对象设计的思维去看:
静态也好,实例化也好,对你现在的项目,是工作量有区别呢?还是代码质量有区别?
又或者是可扩展性有区别?

等你什么时候发现差别了,在新的项目中使用更加有效的手段,过去的就让他过去
huxiaoiqing0007 2011-11-22
  • 打赏
  • 举报
回复
如果有一天,你的一个业务逻辑或者数据访问存在多种实现手段的时候,
你就会明白Method和static Method之间的差异

你的意思,好像明白了一点,但不知道自己明白的对不对。
能不能给个例子,学习下?
huxiaoiqing0007 2011-11-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 microtry 的回复:]
1.我看了一下你的层之间的驱动关系,你的bll实际上是多余的,
因为你并没有抽离出真正的业务逻辑;
2.编程方法服务于设计需求,
如果有一天,你的一个业务逻辑或者数据访问存在多种实现手段的时候,
你就会明白Method和static Method之间的差异
[/Quote]
你说的很对。因为刚学习,并没有抽离出真正的业务逻辑,所以现在的bll基本上只调用了dal层的方法对数据库进行操作(刚接触,还不太懂)。
缪军 2011-11-22
  • 打赏
  • 举报
回复
1.我看了一下你的层之间的驱动关系,你的bll实际上是多余的,
因为你并没有抽离出真正的业务逻辑;
2.编程方法服务于设计需求,
如果有一天,你的一个业务逻辑或者数据访问存在多种实现手段的时候,
你就会明白Method和static Method之间的差异
xiongxyt2 2011-11-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 huxiaoiqing0007 的回复:]
引用 1 楼 vrhero 的回复:
什么叫“动态方法”?

实例对象和静态对象的概念是OOP的基础概念,如何定义哪里适用是有严格的规范的,由不得你方不方便省不省事,跟什么“三层”更是毫无关系...先打好基础再去想怎么吃成胖子...

比如我把BLL层的方法都定义成静态方法,然后直接用类名.方法名调用,可以吗?这和先new一个类的实例,然后用实例调用方法,如,AMPLE a=new AM……
[/Quote]
当然有区别了,静态方法是属于类的,都定义成静态方法,要看需求,静态方法只能访问类中的静态成员,如果要访问就不行了。
1、C#静态方法属于类所有,类实例化前即可使用。
2、非静态方法可以访问类中的任何成员,静态方法只能访问类中的静态成员。


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


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


1.static方法是类中的一个成员方法,属于整个类,即不用创建任何对象也可以直接调用!
static内部只能出现static变量和其他static方法!而且static方法中还不能使用this....等关键字..因为它是属于整个类!
2.静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。
3.静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存.
4.C#中的方法有两种:实例方法,静态方法.


静态方法中用:
string className = System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName;
非静态方法中还可以用:
string className = this.GetType().FullName;

参考
jimh 2011-11-22
  • 打赏
  • 举报
回复
如果跟实例环境无关,那使用静态方法是最理想的。
hztltgg 2011-11-22
  • 打赏
  • 举报
回复
你的BLL层的方法都没有状态的吗?全部的状态都是从参数里调用?如果是的话,都会有建议让你改成静态方法。
huxiaoiqing0007 2011-11-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 vrhero 的回复:]
什么叫“动态方法”?

实例对象和静态对象的概念是OOP的基础概念,如何定义哪里适用是有严格的规范的,由不得你方不方便省不省事,跟什么“三层”更是毫无关系...先打好基础再去想怎么吃成胖子...
[/Quote]
比如我把BLL层的方法都定义成静态方法,然后直接用类名.方法名调用,可以吗?这和先new一个类的实例,然后用实例调用方法,如,AMPLE a=new AMPLE();a.GetModel();有什么区别?
vrhero 2011-11-22
  • 打赏
  • 举报
回复
什么叫“动态方法”?

实例对象和静态对象的概念是OOP的基础概念,如何定义哪里适用是有严格的规范的,由不得你方不方便省不省事,跟什么“三层”更是毫无关系...先打好基础再去想怎么吃成胖子...

110,533

社区成员

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

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

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