我正在学习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
成为一个静态字段。按照这种思路,一切都会变得静止。
我出错了什么?
答案 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中只定义函数。