【问题标题】:C# CS0120 "An object reference is required for the non-static field, method, or property" [duplicate]C# CS0120“非静态字段、方法或属性需要对象引用”[重复]
【发布时间】:2016-02-09 20:24:39
【问题描述】:
class Program
{
    int[] arrayOne = new int[3];
    int[] arrayTwo = new int[5];
    int[] arrayThree = new int[7];
    int sumOne = 0;
    int sumTwo = 0;
    int sumThree = 0;

    static void Main()
    {

        //call method to generate numbers
        generateRandomNumbers();

        //call method to get sums of arrays
        sumOne = getSum(arrayOne);
        sumTwo = getSum(arrayTwo);
        sumThree = getSum(arrayThree);

        //call method to show numbers in each array and their sum
        showNumbers(arrayOne);
        showNumbers(arrayTwo);
        showNumbers(arrayThree);

        ReadKey();
    }

    private static void generateRandomNumbers()
    {
        Random random = new Random();
        //load in values for arrayOne
        for (int i = 0; i < arrayOne.Length; i++)
            arrayOne[i] = random.Next(1, 99);

        //arrayTwo
        for (int j = 0; j < arrayTwo.Length; j++)
            arrayTwo[j] = random.Next(1, 99);

        //arrayThree
        for (int k = 0; k < arrayThree.Length; k++)
            arrayThree[k] = random.Next(1, 99);
    }

    private static int getSum(int[] array)
    {
        int total = 0;

        for (int x = 0; x < array.Length; x++)
            total += array[x];

        return total;
    }

    private static void showNumbers(int[] array)
    {
        for (int m = 0; m < array.Length; m++)
            Write("{0, 5}", array[m]);

        switch (array.Length)
        {
            case 3:
                Write(" = {0}", sumOne);
                break;
            case 5:
                Write(" = {0}", sumTwo);
                break;
            case 7:
                Write(" = {0}", sumThree);
                break;
        }
        WriteLine();

    }
}

基本上,在我使用arrayOne、arrayTwo、arrayThree 和 sumOne、sumTwo、sumThree 的任何地方都会出现错误。从 Main 和 generateRandomNumbers 方法中删除 'static' 会删除所有错误,但是如果没有静态 Main 方法,它当然无法编译。

在我的 C# 课程中,我们目前正在学习方法和数组,这个程序的目标是将随机数放入三个数组中,然后显示每个数字和数组的总和。

我已经四处搜索,答案大多是“创建实例”,但我不知道如何去做。任何帮助将不胜感激!

【问题讨论】:

  • 旁注请查看minimal reproducible example 以获取有关创建更好的代码示例的指导。
  • 您的 generateRandomNumbers 是属于“类”的静态函数,而您的 arrayOne 是属于“实例”的字段。 public class Program {} 是一个类。 var p = new Program() 是“程序”类的一个实例。这就像“Person”和“John”,其中 John 是 Person 的一个实例。在您的情况下,最简单的方法是将 arrayOne...etc 也设为静态。
  • @Bjørn-RogerKringsjå 我不知道。对于Meta Stack Overflow,这是一个非常好的问题。如果您想询问,请确保在那里搜索现有帖子以澄清您的观点。

标签: c#


【解决方案1】:

当你把所有东西都塞进Program 时,通常最简单的方法就是让所有东西都是静态的,因为Main 需要是静态的。因此,一种选择是使您的字段静态:

static int[] arrayOne = new int[3];
static int[] arrayTwo = new int[5];
static int[] arrayThree = new int[7];
static int sumOne = 0;
static int sumTwo = 0;
static int sumThree = 0;

另一种选择是让所有非静态的东西都使用以下语法创建一个Program实例

var program = new Program();

然后引用该实例的属性和方法

    //call method to generate numbers
    program.generateRandomNumbers();

    //call method to get sums of arrays
    program.sumOne = program.getSum(arrayOne);
    program.sumTwo = program.getSum(arrayTwo);
    program.sumThree = program.getSum(arrayThree);

如您所见,保持一切静态更容易,除非您需要为每个实例设置不同的属性。

【讨论】:

    猜你喜欢
    • 2021-09-21
    • 2019-06-22
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多