因此,我对类及其变量有一些疑问,主要是关于“消息消息”的;在我之前编写的代码中。
我的主要问题是:为什么我可以在类范围内声明此Message message;
,而不必将其放在方法范围内?,因为我 THINK 需要将实例化放入方法中,此外,Message message;
到底是什么变量?是实例化吗?
public class Message
{
public string MessageValue() => "Hello World";
}
public class Write
{
Message message;
private void printMessage() => Console.WriteLine(message.messagevalue());
}
答案 0 :(得分:2)
有几点需要牢记。在您的示例中,Message
是 type ,而message
是实际字段或变量的名称。
Message message;
您基本上是在声明变量的类型,以及变量的名称(也可能是Message foo
之类的名称)。
new Message();
SomeMethod(new Message());
我们正在创建Message
的新实例。然后,我们使用分配来存储要保留的新实例。
在第二个示例中,我们将Message
的新实例传递给期望它的此类,即使我们没有将它保存到变量中。
message1 = message2;
非常自我解释。
Message message = new Message();
在这里,我们正在做以上所有操作。我们正在创建变量,说出什么类型,然后创建一个新实例。这是很常见的。如此普遍,以至于人们厌倦了三遍写出Message
,因此C#添加了一个新语法,该语法实际上在做同样的事情,没有任何区别:
var message = new Message();
C#可以告诉message is supposed to be and will make
消息是哪种类型的消息,因此我们不必多余。
关于实例化需要在方法中,您很直觉是正确的。
做
public class Foo
{
public Message message = new Message();
}
是完全有效的C#语法,可以正常工作并且可以编译。但是,它实际上是在做什么:
public class Foo
{
public Message message;
public Foo()
{
message = new Message();
}
}
这实际上在Unity中给我造成了一个问题。在Unity中,如果创建了一个从MonoBehavior
继承的对象,则不再允许使用构造函数创建该对象,并且它以某种方式完全绕过了调用构造函数的过程。这确实很烦人,并使事情变得更加复杂。
复杂性之一是从未调用过这些字段初始化器,所以我在没有意识到如何的情况下得到了空引用异常。我花了一段时间才弄清楚。
现在,我必须将其手动放入创建对象时Unity调用的Awake()
方法中,基本上是编译器会执行的操作。
编辑:正如Thomas Schremser指出的那样,var
仅在方法内部起作用。
为进一步说明,Message message;
是字段减速度(如果在函数内部,则为变量减速度),其中Message
是类型,而message
是字段/变量。语法为Type memberName = new Type()
字段是属于类的变量,可以属于类实例,也可以属于类本身。例如:
public class Foo
{
public class int InstanceField; // This belongs to individual instances
public static int StaticField; // This belongs to the class itself
// (accessed via Foo.StaticField)
public var ImplicitlyType = 3; // ERROR: Fields can't be implicitly typed
public void Bar()
{
int notAField; // This is only accessible in this function,
// Making it a local variable, not a field
var implicitlyType = 4; // This works because implicitlyTyped is a local variable
// It's type is also of int, not var
}
public void Baz(int alsoNotAField)
{
// alsoNotAField is a parameter. It's value will be given from other methods
// alsoNotAField is also only usable in the scope of this method
notAField++; // ERROR: notAField can't be used here, because it's limited to Bar()
}
}
字段是属于类的变量的类型,而方法是属于类的函数的类型。
函数外部的变量称为字段,在C#中无法在类外部具有函数。因此,从某种意义上讲,C#仅具有方法。
答案 1 :(得分:0)
让我们看一下编写类并深入研究它:
public class Write
{
Message message;
private void printMessage() => Console.WriteLine(message.messagevalue());
}
Message message;
是一个字段,该字段的作用域为您类的称为message的实例。
Microsoft docs中字段的定义:
字段是直接在类中声明的任何类型的变量 或结构。字段是其包含类型的成员。
表示message
是Message
类的字段类型,您可以使用它通过Message
类访问Write
类。
例如:
Write write = new Write();
write.message = new Message();
message.messagevalue();