我想知道如何从另一个类调用方法而不必创建该类的新实例。我已经看过了这个,我看到的90%的例子都要求我制作我引用的类的新副本。
这样的事情:
Fooclass test = new Fooclass();
test.CallMethod();
但是,我想知道是否有一种方法可以在不创建新类实例的情况下调用该方法。现在我已经统一尝试了以下内容。
public ImageLoader image;
void Start ()
{
image = gameObject.GetComponent<ImageLoader>() as ImageLoader;
}
void OnClick()
{
image.MoveForward();
}
但是,当我运行此操作时,我收到以下错误:
NullReferenceException:未将对象引用设置为对象的实例
我知道这将通过制作我的图像加载器类的新实例来解决,但我不能这样做,因为它保存了很多我不想多次复制的数据。
答案 0 :(得分:3)
是的,你可以。第一种方法是让你的班级变得静止。
public static class Fooclass
{
// I don't know the return type of your CallMethod, so I used the void one.
public static void CallMethod()
{
}
}
这样,无论您何时使用代码,都可以像下面这样调用CallMethod()
:
Fooclass.CallMethod()
另一个应用是在当前类中定义静态方法,而不需要类是静态的,如下所示:
public class Fooclass
{
// I don't know the return type of your CallMethod, so I used the void one.
public static void CallMethod()
{
}
}
现在,由于Fooclass
的所有实例都会共享名为CallMethod
的相同方法,因此您可以像下面这样调用它:
Fooclass.CallMethod()
不再需要实例化Fooclass类型的对象,尽管现在Fooclass现在还不是一个静态类!
有关进一步的文档,请查看链接Static classes and Static Members。
答案 1 :(得分:2)
创建一个静态类/静态方法。如果你不希望你的类是静态的,那么使方法静态就足够了。
class my_Class
{
public static void Print()
{
Console.WriteLine("Hello World");
}
}
my_Class.Print();
答案 2 :(得分:1)
如果您的其他类的方法没有使用任何实例级别变量,那么您可以将其设置为静态并使用它
Fooclass.CallMethod();
答案 3 :(得分:1)
标记的答案适合您的问题,但请注意您的原始问题似乎有所不同。
我想知道导致NullReferenceException: Object reference not set to an instance of an object
错误的原始问题是您的OnClick()
方法之前调用了名为Start()
的方法,还是调用image = gameObject.GetComponent<ImageLoader>() as ImageLoader;
返回所需类的有效实例,因此image
始终为null。
答案 4 :(得分:0)
您需要在静态/非静态static
中声明class
成员。即使没有创建类的实例,static
成员也可以在class
上调用。
例如:
public class Automobile
{
public static int NumberOfWheels = 4;
public static int SizeOfGasTank
{
get
{
return 15;
}
}
public static void Drive() { }
public static event EventType RunOutOfGas;
// Other non-static fields and properties...
}
Static
成员在第一次访问static
成员之前和static
构造函数(如果有的话)被调用之前被初始化。要访问静态类成员,请使用类的名称而不是变量名来指定成员的位置,如以下示例所示:
Automobile.Drive();
int i = Automobile.NumberOfWheels;
static
成员始终由class
名称访问,而不是实例名称。无论创建了多少个类实例,都只存在static
成员的一个副本。 Static
方法和属性无法访问其包含类型中的非静态字段和事件,除非在方法参数中显式传递,否则它们无法访问任何对象的实例变量。
来源:http://msdn.microsoft.com/en-us/library/79b3xss3.aspx
希望这会对你有所帮助。
Shishir