2010-12-22 30 views
4

我正在学习C#,并且无法理解static关键字。了解C#中的静态内容#

说我有以下代码:

using System; 
using System.IO; 
using System.IO.Ports; 

class PortThing 
{ 
    SerialPort port; 

    void InitPort() 
    { 
     if(!File.Exists("/dev/whatever")) 
     { 
      System.Console.WriteLine("Device not found.");  
      port = null; 
     } 
     //else port = something 
    } 

    public static void Main(string[] args) 
    { 
     InitPort(); 
     System.Console.WriteLine("Done."); 
    } 
} 

据我可以理解,一个静态方法是一个属于类而不是该类的对象。所以静态方法不能引用非静态方法/字段,因为它们需要实例化一个类。

编译器抱怨Main()调用InitPort()并希望使其成为静态。我可以这样做,但这需要使port成为一个静态字段。遵循这一思路,一切都将最终成为静态的。

我得到什么错误?

回答

10

你说得对。静态方法只能访问静态成员。非静态成员需要该类的实例才能访问它们。所以,你可以这样做:

public static void Main(string[] args) 
{ 
    new PortThing().InitPort(); 
    System.Console.WriteLine("Done."); 
} 

这样你正在呼吁给定的类实例的实例方法InitPort,你可以保持在port场非静态。

+0

所有静态成员...不只是静态字段 – 2010-12-22 13:06:36

3
public static void Main(string[] args) 
{ 
    PortThing pt = new PortThing(); 
    pt.InitPort(); 
    System.Console.WriteLine("Done."); 
} 
2

你没有得到任何错误。

这里的问题是Main在普通的类中不需要是static。它在这里需要是静态的,因为它为您的程序提供了入口点。换句话说,你需要有一个方法来运行,但是你不能在运行之前创建一个对象,所以这个方法必须是static

没有什么妨碍你真正创造PortThing类的对象,通常使用它:

public static void Main(string[] args) 
{ 
    var pt = new PortThing(); 
    pt.InitPort(); 
    System.Console.WriteLine("Done."); 
} 
1

你说正确的:一个静态方法属于类而不是对象。

但在这种情况下,如果你不想让一切静态,你可以简单地创建类型PortThing的对象,换句话说,实例化这个类,并调用非静态方法。

或者,如果非静态方法不访问任何类属性,至少非静态的,你可以把静态的。

0

静态方法和变量不包含类的实例。

了解静态变量,最重要的是,只有一个变量每个进程的实例(更准确的AppDomain,但大多数的过程只有1 AppDomain中)。我认为静态变量是全局变量。您可以创建一个类的静态构造函数来初始化这些静态变量。当该类首次被访问时,静态构造函数被调用一次。但要注意的有关访问和修改静态成员,尤其是静态的藏品多线程应用程序的并发问题!

静态方法可以被认为是C中的函数。它们可以在不创建任何对象的情况下被调用,这对于性能来说稍微好一些(但应该只在有意义的地方使用)。例如,我将在静态工具类中实现方法int CountNumberOfCommas(string s)作为静态方法,因为这是一个独立于类的任何实例的操作。

你没有做错什么。您只需在两个选项中进行选择:您可以创建一个Program的实例并调用InitPort,或者使InitPort静态,而不是创建一个Program的实例。将所有东西都变成静态的基本上和用C写一个程序是一样的,在这里只定义函数。