在非静态类中声明一个静态方法的意义是什么?
我的理解方式是,在非静态类中声明为static的成员变量会导致该成员变量是唯一的,无论该类的实例数是多少。在非静态类中声明一个静态方法的意义是什么?
现在,在非静态类中声明的静态方法会发生什么?和(最重要的是),在非静态类中声明静态方法的意义是什么?
感谢您的帮助
仅与其参数一起工作的类方法,不调用任何实例方法,不适用于任何实例成员,可以声明为静态。实际上,它应该被声明为静态的,以获得更好的性能,因为静态方法不需要“this”指针。
考虑属于类的小函数,对其参数进行一些计算并返回计算值。这个功能应该是静态的。
我会评价静态正确性检查比性能更高。通过将方法声明为静态,您可以让编译器知道它不能使用任何特定于特定实例的信息,所以当程序员试图这样做时,它会抛出错误或警告,例如,试图将其称为实例方法。 – reinierpost 2011-03-24 09:36:31
如果该方法有事情做与类型,但不是实例那么它可以是静态的。
DateTime.Parse
和Int32.Parse
是例子。
还有一个指导方针是“如果它可以是静态的而不是静态的”。 – 2010-07-13 11:31:56
与亨克霍尔特曼的评论相关:http://stackoverflow.com/questions/790281 – 2010-07-13 11:36:20
例如,您有一个例如Bank_Account
的类,您要在其中计算为该类创建的对象的数量。
所以,你有一个静态字段说count
。然后,当初始化Bank_Account
类的任何对象时,则需要增加存储为此类创建的对象数的字段,但增加此静态变量的方法是静态的,因为为此类创建的所有对象都是相同的。
由于ck表示,它可能是与该类型有关的方法。重要的是要记住,这将是一个效用函数,它不能访问类型/类中的任何成员变量,因为它可以直接调用而不需要任何类的实例。如果您尝试定义访问成员变量(或非静态方法)的静态方法,则实际上会出现编译器错误。
对于创建工厂方法非常有用,它不是任何对象的成员,但需要访问对象的内部以初始化它。
您需要非静态类f.e中的静态方法。对于工厂模式(如果类是其自身的工厂,由雅各·比勒陀利乌斯指出):
MyClass newInstance = MyClass.Create();
或者,如果你想创建的helper方法。 F.E.你可以写一个FTP-类,这是完全正常工作,与Connect()
,SendCommand()
,ReceiveAnswer()
,Disconnect()
等,但要允许用户方便地上传一个文件,而不需要实现整个过程:
MyFTPClass.UploadFile("username", "password", "pathToFile");
我正在迂腐 - 如果类是工厂本身,你的第一句话是正确的。当我使用工厂模式时,我通常会创建单独的工厂类,因为它使测试变得更容易一些。 – 2010-07-13 14:06:32
我不会在这里使用单词'unique'。它在所有实例之间共享_shared_。 – 2010-07-13 11:31:18
@亨克霍尔特曼:谢谢你纠正我。 – Richard77 2010-07-13 11:36:58