了解C#中的静态

时间:2010-12-22 13:04:20

标签: c#

我正在学习C#而我无法理解static关键字。

说我有以下代码:

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成为一个静态字段。按照这种思路,一切都会变得静止。

我出错了什么?

5 个答案:

答案 0 :(得分:10)

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

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

这样您就可以在给定的类实例上调用实例方法InitPort,并且可以使port字段保持非静态。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

你没有错。

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

没有什么可以阻止您实际创建类PortThing的对象并正常使用它:

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

答案 3 :(得分:1)

你说得对:静态方法属于类而不是对象。

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

或者,如果非静态方法不访问任何类属性,至少是非静态方法,则可以使其静态化。

答案 4 :(得分:0)

静态方法和变量是可用的,没有类的实例。

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

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

你没有做错任何事。您只需要在两个选项之间进行选择:您可以创建Program的实例并调用InitPort,或者使InitPort成为静态,而不是创建Program的实例。使一切静态与在C中编写程序基本相同,在C中只定义函数。