需要对象引用?

时间:2011-09-24 18:06:13

标签: c# visual-studio

我正在学习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中使用这两个变量,只需在上面的类中声明它们吗?我很困惑...感谢任何建议。

7 个答案:

答案 0 :(得分:5)

你无法做到,因为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.

答案 1 :(得分:2)

由于Main方法是静态的,因此必须使变量保持静态。

答案 2 :(得分:1)

由于Main static ,您的变量也需要是静态的才能像这样使用。如果您将它们声明为:

static string userChoice;
static int numbeR;

然后它会起作用。

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

答案 3 :(得分:1)

因为Mainstatic

如果你将变量(a.k.a. fields)声明为static也可以在类中声明它们

静态字符串userChoice;    static int numbeR;

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

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

答案 4 :(得分:1)

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

可以静态调用Main(),但在创建Program类的实例之前,不会定义两个类字段。

答案 5 :(得分:1)

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

答案 6 :(得分:0)

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

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();
        }
    }
}