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

时间:2022-07-30 08:13:52
正在学习采用三层架构做程序,有个问题想请教:model层用来传参数; dal用来操作数据库; bll层调用dal层的方法。bll层调用dal层方法时需要生成对应类的实例。窗口中调用bll方法的时候,要实例化一个bll的类。如是dal和 bll类里的方法都定义成静态的,不就用类名直接调用了吗,比每次都实例化要省事些吧?
PS:我知道静态属性只有一份,不同类的属性可能不一样,所以不能用静态的,但是方法用静态的应该不存在这个问题吧?

14 个解决方案

#1


什么叫“动态方法”?

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

#2


引用 1 楼 vrhero 的回复:
什么叫“动态方法”?

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

比如我把BLL层的方法都定义成静态方法,然后直接用类名.方法名调用,可以吗?这和先new一个类的实例,然后用实例调用方法,如,AMPLE a=new AMPLE();a.GetModel();有什么区别?

#3


你的BLL层的方法都没有状态的吗?全部的状态都是从参数里调用?如果是的话,都会有建议让你改成静态方法。

#4


如果跟实例环境无关,那使用静态方法是最理想的。

#5


引用 2 楼 huxiaoiqing0007 的回复:
引用 1 楼 vrhero 的回复:
什么叫“动态方法”?

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

比如我把BLL层的方法都定义成静态方法,然后直接用类名.方法名调用,可以吗?这和先new一个类的实例,然后用实例调用方法,如,AMPLE a=new AM……

当然有区别了,静态方法是属于类的, 都定义成静态方法,要看需求,静态方法只能访问类中的静态成员,如果要访问就不行了。
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;  

参考

#6


该回复于2011-11-22 14:22:21被版主删除

#7


1.我看了一下你的层之间的驱动关系,你的bll实际上是多余的,
  因为你并没有抽离出真正的业务逻辑;
2.编程方法服务于设计需求,
  如果有一天,你的一个业务逻辑或者数据访问存在多种实现手段的时候,
  你就会明白Method和static Method之间的差异

#8


引用 7 楼 microtry 的回复:
1.我看了一下你的层之间的驱动关系,你的bll实际上是多余的,
  因为你并没有抽离出真正的业务逻辑;
2.编程方法服务于设计需求,
  如果有一天,你的一个业务逻辑或者数据访问存在多种实现手段的时候,
  你就会明白Method和static Method之间的差异

你说的很对。因为刚学习,并没有抽离出真正的业务逻辑,所以现在的bll基本上只调用了dal层的方法对数据库进行操作(刚接触,还不太懂)。

#9


如果有一天,你的一个业务逻辑或者数据访问存在多种实现手段的时候,
你就会明白Method和static Method之间的差异

你的意思,好像明白了一点,但不知道自己明白的对不对。
能不能给个例子,学习下?

#10


你可以看看有关接口或者多态的知识
但是要真正理解恐怕还是需要实践积累,

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

等你什么时候发现差别了,在新的项目中使用更加有效的手段,过去的就让他过去

#11


项目不是很大,暂时按照自己的理解去做。自己觉得没区别。那就用静态或者动态。不必太在意理论。实现需求就可以。也许,现在经验不足。做低效率或者无用功,下一个项目就可以避免。这就是项目经验。

#12


编程不重要,它又很混乱的做法。所以看人的能力要看设计,而不是看编程。

而设计,就要看它是否具有基本的扩展性。比如在必要时,它就能继承和多态(而不是什么封装和分类),现在就能够按照接口(或者父类、抽象类,随便你用什么术语,意思基本上一样)来实现这种扩展性。最终,这种设计是直接等同于应用领域概念,而不是计算机概念。

#13


楼上很多回复都已经说了,对于工程设计没有需求、只是纠结在语法是否“方便”上,这不能怪你。只能怪你的老师没有带你去做几个实际的复杂的分析实例。要知道需求是千变万化的,软件需要不断扩展、不断重构、不断用新的东西装旧的内容才能翻新。

#14


感谢!谢谢!看来自己闷头学还不行,还要多交流。分数有限,就按回答的先后给分吧,还请见谅!

#1


什么叫“动态方法”?

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

#2


引用 1 楼 vrhero 的回复:
什么叫“动态方法”?

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

比如我把BLL层的方法都定义成静态方法,然后直接用类名.方法名调用,可以吗?这和先new一个类的实例,然后用实例调用方法,如,AMPLE a=new AMPLE();a.GetModel();有什么区别?

#3


你的BLL层的方法都没有状态的吗?全部的状态都是从参数里调用?如果是的话,都会有建议让你改成静态方法。

#4


如果跟实例环境无关,那使用静态方法是最理想的。

#5


引用 2 楼 huxiaoiqing0007 的回复:
引用 1 楼 vrhero 的回复:
什么叫“动态方法”?

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

比如我把BLL层的方法都定义成静态方法,然后直接用类名.方法名调用,可以吗?这和先new一个类的实例,然后用实例调用方法,如,AMPLE a=new AM……

当然有区别了,静态方法是属于类的, 都定义成静态方法,要看需求,静态方法只能访问类中的静态成员,如果要访问就不行了。
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;  

参考

#6


该回复于2011-11-22 14:22:21被版主删除

#7


1.我看了一下你的层之间的驱动关系,你的bll实际上是多余的,
  因为你并没有抽离出真正的业务逻辑;
2.编程方法服务于设计需求,
  如果有一天,你的一个业务逻辑或者数据访问存在多种实现手段的时候,
  你就会明白Method和static Method之间的差异

#8


引用 7 楼 microtry 的回复:
1.我看了一下你的层之间的驱动关系,你的bll实际上是多余的,
  因为你并没有抽离出真正的业务逻辑;
2.编程方法服务于设计需求,
  如果有一天,你的一个业务逻辑或者数据访问存在多种实现手段的时候,
  你就会明白Method和static Method之间的差异

你说的很对。因为刚学习,并没有抽离出真正的业务逻辑,所以现在的bll基本上只调用了dal层的方法对数据库进行操作(刚接触,还不太懂)。

#9


如果有一天,你的一个业务逻辑或者数据访问存在多种实现手段的时候,
你就会明白Method和static Method之间的差异

你的意思,好像明白了一点,但不知道自己明白的对不对。
能不能给个例子,学习下?

#10


你可以看看有关接口或者多态的知识
但是要真正理解恐怕还是需要实践积累,

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

等你什么时候发现差别了,在新的项目中使用更加有效的手段,过去的就让他过去

#11


项目不是很大,暂时按照自己的理解去做。自己觉得没区别。那就用静态或者动态。不必太在意理论。实现需求就可以。也许,现在经验不足。做低效率或者无用功,下一个项目就可以避免。这就是项目经验。

#12


编程不重要,它又很混乱的做法。所以看人的能力要看设计,而不是看编程。

而设计,就要看它是否具有基本的扩展性。比如在必要时,它就能继承和多态(而不是什么封装和分类),现在就能够按照接口(或者父类、抽象类,随便你用什么术语,意思基本上一样)来实现这种扩展性。最终,这种设计是直接等同于应用领域概念,而不是计算机概念。

#13


楼上很多回复都已经说了,对于工程设计没有需求、只是纠结在语法是否“方便”上,这不能怪你。只能怪你的老师没有带你去做几个实际的复杂的分析实例。要知道需求是千变万化的,软件需要不断扩展、不断重构、不断用新的东西装旧的内容才能翻新。

#14


感谢!谢谢!看来自己闷头学还不行,还要多交流。分数有限,就按回答的先后给分吧,还请见谅!