2010-07-13 135 views
7

我的理解方式是,在非静态类中声明为static的成员变量会导致该成员变量是唯一的,无论该类的实例数是多少。在非静态类中声明一个静态方法的意义是什么?

现在,在非静态类中声明的静态方法会发生什么?和(最重要的是),在非静态类中声明静态方法的意义是什么?

感谢您的帮助

+3

我不会在这里使用单词'unique'。它在所有实例之间共享_shared_。 – 2010-07-13 11:31:18

+0

@亨克霍尔特曼:谢谢你纠正我。 – Richard77 2010-07-13 11:36:58

回答

4

仅与其参数一起工作的类方法,不调用任何实例方法,不适用于任何实例成员,可以声明为静态。实际上,它应该被声明为静态的,以获得更好的性能,因为静态方法不需要“this”指针。

考虑属于类的小函数,对其参数进行一些计算并返回计算值。这个功能应该是静态的。

+1

我会评价静态正确性检查比性能更高。通过将方法声明为静态,您可以让编译器知道它不能使用任何特定于特定实例的信息,所以当程序员试图这样做时,它会抛出错误或警告,例如,试图将其称为实例方法。 – reinierpost 2011-03-24 09:36:31

21

如果该方法有事情做与类型,但不是实例那么它可以是静态的。

DateTime.ParseInt32.Parse是例子。

+10

还有一个指导方针是“如果它可以是静态的而不是静态的”。 – 2010-07-13 11:31:56

+2

与亨克霍尔特曼的评论相关:http://stackoverflow.com/questions/790281 – 2010-07-13 11:36:20

2

例如,您有一个例如Bank_Account的类,您要在其中计算为该类创建的对象的数量。
所以,你有一个静态字段说count。然后,当初始化Bank_Account类的任何对象时,则需要增加存储为此类创建的对象数的字段,但增加此静态变量的方法是静态的,因为为此类创建的所有对象都是相同的。

+0

为什么这个答案是downvoted ??? :-(这也是说什么'ck's''答案是说,但它是这种方法的例子!! – Himadri 2010-07-13 11:42:56

+1

我不明白downvote要么:在我看来这是一个重要的一点。如果你有数据是关于所有实例或任何实例,而不是一个特定的实例,那么它应该是静态的。例如,就在昨天,我创建了一个类,我需要为每个实例分配一个唯一的ID。制作一个静态计数器是一种简单而合乎逻辑的方式 – Jay 2010-07-13 13:46:10

1

由于ck表示,它可能是与该类型有关的方法。重要的是要记住,这将是一个效用函数,它不能访问类型/类中的任何成员变量,因为它可以直接调用而不需要任何类的实例。如果您尝试定义访问成员变量(或非静态方法)的静态方法,则实际上会出现编译器错误。

5

对于创建工厂方法非常有用,它不是任何对象的成员,但需要访问对象的内部以初始化它。

5

您需要非静态类f.e中的静态方法。对于工厂模式(如果类是其自身的工厂,由雅各·比勒陀利乌斯指出):

MyClass newInstance = MyClass.Create(); 

或者,如果你想创建的helper方法。 F.E.你可以写一个FTP-类,这是完全正常工作,与Connect()SendCommand()ReceiveAnswer()Disconnect()等,但要允许用户方便地上传一个文件,而不需要实现整个过程:

MyFTPClass.UploadFile("username", "password", "pathToFile"); 
+1

我正在迂腐 - 如果类是工厂本身,你的第一句话是正确的。当我使用工厂模式时,我通常会创建单独的工厂类,因为它使测试变得更容易一些。 – 2010-07-13 14:06:32

3

如果不能在非静态类中声明静态方法(和私有成员变量),就不可能实现Singleton模式。

请参阅Singleton

相关问题