3

已解决:开发环境问题。重新启动开发环境,一切正常。

第一次问,如果我做错了,请告诉我。

我试图在 C# 中使用特定于实例的变量来解决问题。以下测试代码似乎应该可以工作,但会引发错误:

非静态字段、方法或属性需要对象引用...

执行此操作的正确方法是什么,以便我拥有一个对类的每个实例都是唯一的公共 var,并且可以在函数中设置该 var(静态或其他)?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AlchemyWebSocketsTest2
{
    class KHandler
    {
        public string name = "wut";
        static void KHandlerInstantiate()
        {
            name = "huh";
            Console.WriteLine("All Good.");
        }

    }
}
4

4 回答 4

6

你需要一个 KHandler 的实例。注意作为类handler实例的对象KHandler

namespace AlchemyWebSocketsTest2
{
   class KHandler
   {
     public string name = "wut";
     static void Main()
     {
        KHandler handler = new KHandler();
        handler.name = "huh";
        Console.WriteLine("All Good.");
     }

  }
}
于 2012-12-06T17:35:42.220 回答
0

您正在尝试访问静态函数内部的非静态成员。如果您声明namepublic static string name = "wut";,那么您的代码应该可以编译。我建议看一下静态类和方法

于 2012-12-06T17:36:54.287 回答
0

您正在尝试在静态(类型)方法中分配非静态(实例)成员。要分配名称,您必须创建他 KHandler 类的实例

static void Main()
{
     var khandlerInstance = new KHandler();
     khandlerInstance.name = "huh";
     Console.WriteLine("All Good.");
}

UPD。如果需要通过静态方法为每个实例分配一个变量,则必须将实例作为参数传递。

class KHandler
{
    string Name;
    public static void ChangeName(KHandler targetInstance, string newName)
    {
        targetInstance.Name = newName;
    }
}
于 2012-12-06T17:37:33.783 回答
0

好的,一些构造函数怎么样?

// a sample base class
class KBase  {
     public readonly int value;  // making it readonly means it can only be assigned to once, and that has to happen during a constructor.
     public KBase ( int startValue ) { value = startValue; }
}

class KHandler : KBase
{
    public readonly string name = "wut";

    // this is a parameterless constructor, whose implementation invokes another constructor ( the one below ) of this class
    public KHandler () : this ( "huh" ) {
    }

    // this is a 1 parameter constructor, whose implementation ensures KBase is properly initialized, and then proceeds to initialize its part of the new instance.
    public KHandler ( string val ) : base ( 3 ) { 
        name = val;
    }
}

class Test {
    static void Main()
    {
        // this next line calls the parameterless constructor I defined above
        KHandler handler = new KHandler();  

        // and this next line calls the 1 parameter constructor
        KHandler handler2 = new KHandler("something else");

        Console.WriteLine("All Good 1"+handler.name);
        Console.WriteLine("All Good 2"+handler2.name);
    }
}

我认为你想要构造函数的基本机制,在分配新类实例并“归零”后,它们在稍微特殊的环境中运行。特殊环境是编译器/语言确保正确初始化所有基类和字段,并且允许在构造期间(仅)分配给只读成员。

构造函数可以调用基类构造函数来正确初始化这些基类;构造函数还可以在继续之前调用同一类的另一个构造函数。

每个类可以有多个构造函数——就像我上面的例子一样。如果您不指定构造函数,则编译器会有效地为您插入一个空白的无参数构造函数。如果您不想要这种行为,那么添加您自己的构造函数(任何参数列表)会取消编译器/语言自动创建空白无参数构造函数。(如果您添加了自己的参数化构造函数并且仍然想要无参数构造函数,则必须自己将其添加回来。)

第一个构造函数(无参数的)作为第一个 new KHandler() 的结果调用,第二个构造函数由第二个 new KHandler(字符串)调用。

一旦构建,对象就被认为可以使用了。无论如何,搜索构造函数的一般构造,您将获得更多信息。

于 2012-12-06T17:56:56.697 回答