电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

什么时候考虑使用静态


发布日期:2024/1/27
 

静态方法不用new对象可以直接调用

与类相关与对象无关

不需要对象的方法

工厂方法

如果某个方法是用频率较高或者方法本身通用性较强无需初始化类成员变量则可以使用静态方法那样方便速度也快

可以直接拿来就用的方法就算是静态的

肯定不涉及具体对象因为静态方法内是无法直接使用任何非静态成员的

(1)制作工具类

)可以当作"作局"对象或方法来使用

(1)重载"操作符"

)C#中的扩展方法(配合C#的扩展事件引领C#向动态语言的方向发展)

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

静态方法不用创建实例就可调用比较简单从面向对象的角度上来说在抉择使用实例化方法或静态方法时应该根据是否该方法和实例化对象具有逻辑上的相关性如果是就应该使用实例化对象 反之使用静态方法

我是把静态类当做全局变量和全局函数的整合对象来用的

全局累加时用

不需要生成对象的

经常频繁使用的

工具类里的(如SqlHelper)

适当地使用static方法本身并没有什么当一个人从来不懂使用多态接口设计时很自然地会滥用static方法

个人理解在多个类中需要调用并且是与对象无关的方法可设为静态方法方便调用

所有对象共有的方法

再不关系到任何于特定对象相关的操作

比如学生的年龄就是学生的相关

修改学生的年龄就不适合用静态方法

一般来说如果你的方法里没有用到this关键字

那就适合用静态方法

通常通用的类中一些常用的方法可以设计为静态类

只要是没有用到类的状态信息只从参数获取信息的都可以为静态的

可以实现某些特殊的设计模式如Singleton

由于没有this指针可以把某些系统API的回调函数以静态函数的形式封装到类的内部

可以封装某些算法比如数学函数如lnsintan等等这些函数本就没必要属于任何一个对象所以从类上调用感觉更好

总之从OOA/OOD的角度考虑一切不需要实例化就可以有确定行为方式的函数都应该设计成静态的

静态方法与非静态方法最明显的区别就是如果某个方法是公共静态的那么可以直接通过类名方法名的方法来调用而公共实例方法则需要事先实例化对象然后才能调用

这些各种说法基本上都是正确的但是其中绝大多数是讲了静态实例的区别以及静态方法的特征

很少有说到何时或是为什么要使用静态的

静态包括静态类和静态成员(静态方法 和 静态属性)既然搜索出来的这些说的都是静态成员(基本上说的都是静态方法)那么我也就先仅对静态方法谈一谈自己的看法

上中学数学尤其是平面几何的时候老师经常讲定义性质的区别性质只是它表现出来的特征而已定义才是真正的决定性的东西

我觉得静态方法的定义当然是 static 关键字了没有用到this指针这一点才是静态方法的首要性质(本质特征)像什么【共通】【全局】【单例模式】呀那都是它的应用场景或是说使用静态方法来达到的目的

那么说到何时该使用静态方法其实是困扰很多程序员的苦恼问题不明白这一点也从一个侧面反映出对OO思想的理解不够就很可能通过滥用静态方法已达到在面向对象的语言中继续进行面向过程的编程这是很可怕的

其实方法是否涉及具体类的实例或者简单的说是否涉及数据(如果使用就要用到this指针)是决定是否使用静态方法的根部要因然而判断是否涉及到数据也是要看当前设计思路的有时候不够OO的设计可能会将本该设计到数据的实例方法数据相关变成数据无关(与OO不同面向过程的编程就是将 方法 与 数据 分开)在这样的设计思路下你会发现怎么什么动作都是与数据无关的呢?恩这就该开始滥用静态方法了

本想举一个好一点的例子但是时间匆忙就简短说一下 Log 吧有人认为写日志是一个工具在干活应该是 Logdebug();

有人认为日志记录器是个小精灵应该有血有肉 Log logger = new Log(); loggerdebug();

可能你会认为这要取决于Log类以及debug方法的复杂程度

也许你会认为这要看Log类中是否有数据比如输出Level

也许还有其他理由

而我觉得可以说是仁者见仁智者见智也可以看做是不同的编程风格也可以 总之需要细细体会了

追加一个稍好一些的例子检查 TextBox 是否输入了数据如果没有则依据某一个ID从配置文件中读取一句话(错误信息)然后弹出并将此 TextBox 的底色置成红色再将焦点放到上面去

如果你不希望这一系列的操作(大概行代码)每次都要写一遍你就会设法把它提炼为共通

方法一(静态)

C#代码

public class Checker

{

public static void CheckEmpty(TextBox textBox)

{

if (textBoxTextLength == )

{

string msg = PropertiesReadMessage();

MessageBoxShow(msg);

textBoxBackColor = ColorRead;

textBoxFocus();

}

}

}

CheckerCheckEmpty(textBox);

方法二(实例)

C#代码

public class MyTextBox : TextBox

{

public void CheckEmpty()

{

if (thisTextLength == )

{

string msg = PropertiesReadMessage();

MessageBoxShow(msg);

thisBackColor = ColorRead;

thisFocus();

}

}

}

MyTextBox textBox = new MyTextBox();

textBoxCheckEmpty();

因为Swing使用的很少所以就用WinForm的控件来举例子了所以代码是C#的其实没有关系所有OO语言在这一点上都是一样的

如果你不觉得【扩展】SDK的控件有多么恐怖或者应为其他原因已经对其扩展了那么我更推荐使用实例方法(方法二)理由吗对控件的检查本来就是和控件自身(Text属性)息息相关的是活生生的

(这里不讨论读配置文件MessageBox 等操作是否违背开闭原则)

上一篇:DataGrid同时具有分页和排序功能及注意点

下一篇:对象数组根据某属性列的灵活排序