gpt4 book ai didi

c# - .NET - 有什么方法可以创建非静态线程方法吗?

转载 作者:太空狗 更新时间:2023-10-29 22:04:18 26 4
gpt4 key购买 nike

有什么方法可以在 .NET 中创建非静态线程方法吗?请显示代码。

以下代码无效:

ThreadStart ts = delegate { drawFloorAround(); };
public void drawFloorAround(){            ...}

出现此错误 -> “字段初始值设定项无法引用非静态字段、方法或属性”。如果我将方法更改为静态,它就可以工作。但我不想。

最佳答案

... gives this error "A field initializer cannot reference the non-static field, method, or property".

仔细阅读错误信息。它准确地告诉你哪里出了问题。 字段初始值设定项 不能引用非静态方法。那是因为编译器试图保护您免受此错误的影响:

class C
{
int foo;
int bar = GetBar();
public C(int newFoo)
{
this.foo = newFoo;
}
private int GetBar() { return this.foo + 1; }
}

你执行“new C(123)”。 bar 设置成什么?如果这是合法的代码,那么它将被设置为 1,而不是 124。为什么?因为首先 foo 被初始化为零,然后调用 GetBar(),然后构造函数主体将 this.foo 设置为 123。

为防止此错误,在字段初始值设定项中引用实例方法或字段是完全非法的。

现在,您可能会合理地指出,在您的代码中,您没有使用实例方法,您只是引用它。你从来没有真正调用它。这实际上是安全的。然而,C#的规则被设计得简单而保守;即使我们可以证明这种情况是安全的,我们还是采取保守、简单的方式,并说在字段初始值设定项中对实例的任何引用都是非法的。

If I change the method to static, it works.

正确。在这种情况下,该方法不依赖于尚未设置的实例状态。

But I don't want to.

好的,那么您唯一的选择就是停止使用字段初始值设定项。将初始化放在构造函数中;然后您负责确保初始化不会意外使用未初始化的状态。

关于c# - .NET - 有什么方法可以创建非静态线程方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4411639/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com