需要对象引用

本文关键字:对象引用 | 更新日期: 2023-09-27 18:09:47

我正在学习c#并编写了一段简单的代码,但我不明白为什么我必须在Main方法的范围内声明变量userChoice和numberR,而不是在类的范围内。如果我像这样在类中声明它,我会得到构建错误

using System;
namespace FirstProgram
{
class Program
{
   string userChoice;
   int numbeR;
 static void Main()
    {
        Console.WriteLine("Write a number...");
        userChoice = Console.ReadLine();
        numbeR = Convert.ToInt32(userChoice);
        Console.WriteLine("You wrote {0}", numbeR);
        Console.ReadLine();
    }
}
}

但只有这样才不会给我错误:

using System;
namespace FirstProgram
{
class Program
{    
 static void Main()
    {
        string userChoice;
        int numbeR; 
        Console.WriteLine("Write a number...");
        userChoice = Console.ReadLine();
        numbeR = Convert.ToInt32(userChoice);
        Console.WriteLine("You wrote {0}", numbeR);
        Console.ReadLine();
    }
}
}

我不应该在Main中使用这两个变量,就像上面那样在类中声明它们吗?我很困惑……谢谢你的建议。

需要对象引用

您不能这样做,因为Main()是一个静态函数。您的变量被声明为实例变量,并且只能在Program类的实例上访问。如果将userChoicenumbeR声明为静态变量,则可以编译。

static string userChoice;
static int numbeR;
static void Main()
{
    //your code
}

静态成员意味着可以在不实例化类的情况下使用成员。想象一下:

public class MyClass
{
     public static int StaticInt;
     public int NonStaticInt;
}

意味着你可以这样做:

MyClass.StaticInt = 12;  // legal
MyClass.NonStaticInt = 12; // error, can't staticly access instance member

和所有类都可以访问该更改,因为程序中只有一个MyClass.StaticInt。要更改NonStaticInt,必须创建该类的实例,如下所示:

MyClass mine = new MyClass();
mine.NonStaticInt = 12;  // legal
mine.StaticInt = 12; // Error, cannot access static member on instance class.

由于Main方法是静态的,所以必须将变量设置为静态

由于Main静态,因此您的变量也需要是静态的,以便这样使用。如果您将它们声明为:

static string userChoice;
static int numbeR;

那么它将工作。

您目前在Program对象的实例中声明了它们。但是,静态方法(如Main)是类型的一部分,而不是特定的实例。

因为Mainstatic

如果您将变量(也称为字段)声明为静态,则可以在类

中声明它们。

静态字符串userChoice;static int numbeR;

static方法和变量称为instance方法和变量。实例变量与特定对象相关,而static变量在类中所有创建的对象之间共享。

规则是static方法只能调用静态方法和访问static变量,但是实例方法可以调用static和非静态变量和方法

原因是Main()是一个静态方法,两个类字段(userChoice和numbeR)是实例字段。

Main()可以静态调用,但是直到创建了Program类的实例之后,才会定义这两个类字段。

Main()方法被声明为静态的。然而,在第一个代码示例中,您声明了两个变量(userChoice &编号)作为实例变量。静态Main()方法不属于特定对象,而是属于特定类型。但是,您的变量确实属于Program类型的特定实例。不能在静态方法中使用实例变量

问题是Main是静态的。必须将变量userChoice和numbeR声明为静态变量。然后它将编译。以下是更正后的示例:

using System;
namespace FirstProgram
{
    class Program
    {
        static string userChoice;
        static int numbeR;
        static void Main()
        {
            Console.WriteLine("Write a number...");
            userChoice = Console.ReadLine();
            numbeR = Convert.ToInt32(userChoice);
            Console.WriteLine("You wrote {0}", numbeR);
            Console.ReadLine();
        }
    }
}