【发布时间】:2011-12-17 12:37:42
【问题描述】:
【问题讨论】:
-
静态类/方法对于实现单例模式和工厂模式很有用...
-
@Yahia:带有静态类的单例模式? I don't think so.
-
@BoltClock 如果你仔细阅读然后我写了“静态类/方法”,我很确定静态方法在实现单例模式时很有用......
【问题讨论】:
将类设为静态只会阻止人们尝试创建它的实例。如果您的所有类都是静态成员,那么最好将类本身设为静态。
【讨论】:
如果一个类被声明为静态,那么变量和方法需要被声明为静态。
一个类可以声明为静态的,表明它只包含静态成员。无法使用 new 关键字创建静态类的实例。加载包含类的程序或命名空间时,.NET Framework 公共语言运行时 (CLR) 会自动加载静态类。
使用静态类来包含与特定对象无关的方法。例如,创建一组不作用于实例数据并且不与代码中的特定对象关联的方法是一个常见的要求。您可以使用静态类来保存这些方法。
->静态类的主要特点是:
示例
static class CollegeRegistration
{
//All static member variables
static int nCollegeId; //College Id will be same for all the students studying
static string sCollegeName; //Name will be same
static string sColegeAddress; //Address of the college will also same
//Member functions
public static int GetCollegeId()
{
nCollegeId = 100;
return (nCollegeID);
}
//similarly implementation of others also.
} //class end
public class student
{
int nRollNo;
string sName;
public GetRollNo()
{
nRollNo += 1;
return (nRollNo);
}
//similarly ....
public static void Main()
{
//Not required.
//CollegeRegistration objCollReg= new CollegeRegistration();
//<ClassName>.<MethodName>
int cid= CollegeRegistration.GetCollegeId();
string sname= CollegeRegistration.GetCollegeName();
} //Main end
}
【讨论】:
静态类在某些情况下很有用,但也有可能滥用和/或过度使用它们,就像大多数语言功能一样。
正如 Dylan Smith 已经提到的,使用静态类最明显的情况是,如果你有一个只有静态方法的类。允许开发人员实例化这样的类是没有意义的。
需要注意的是,过多的静态方法本身可能表明您的设计策略存在缺陷。我发现当您创建一个静态函数时,最好问问自己——它是否更适合作为 a) 实例方法或 b) 接口的扩展方法。这里的想法是对象行为通常与对象状态相关联,这意味着行为应该属于对象。通过使用静态函数,您暗示该行为不应属于任何特定对象。
过度使用静态函数会阻碍多态和接口驱动的设计——它们不能在派生类中被覆盖,也不能附加到接口上。通常最好通过扩展方法将您的“帮助”功能绑定到接口,以便接口的所有实例都可以访问该共享的“帮助”功能。
在我看来,静态函数绝对有用的一种情况是创建一个 .Create() 或 .New() 方法来实现对象创建的逻辑,例如当您想要代理正在创建的对象时,
public class Foo
{
public static Foo New(string fooString)
{
ProxyGenerator generator = new ProxyGenerator();
return (Foo)generator.CreateClassProxy
(typeof(Foo), new object[] { fooString }, new Interceptor());
}
这可以与代理框架(如 Castle Dynamic Proxy)一起使用,您希望根据分配给其方法的某些属性来拦截/注入功能到对象中。总体思路是您需要一个特殊的构造函数,因为从技术上讲,您正在创建具有特殊附加功能的原始实例的副本。
【讨论】: