我编写的示例代码中的“变量” /“实例化”究竟是什么?

时间:2018-07-22 07:25:06

标签: c# class variables instantiation

因此,我对类及其变量有一些疑问,主要是关于“消息消息”的;在我之前编写的代码中。

我的主要问题是:为什么我可以在类范围内声明此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());
}

2 个答案:

答案 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字段的定义:

  

字段是直接在类中声明的任何类型的变量   或结构。字段是其包含类型的成员。

表示messageMessage类的字段类型,您可以使用它通过Message类访问Write类。

例如:

Write write = new Write();
write.message = new Message();
message.messagevalue();