非静态字段需要对象引用

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

我似乎不知道出了什么问题。

如果我删除了静态修饰符,那么我在调用items.getTotal()时会遇到问题。如果我将其添加回方法中,那么我会在返回数字字段时遇到问题。

如果有任何帮助,我将不胜感激,我仍在学习中。

我在下面的注释旁边标记了我在哪一行有错误。

namespace Something
{
class Program
{
    static void Main()
    {
        List<items> item = new List<items>();
        int choice;
        while (true)
        {
            Console.WriteLine("Please select an option:");
            Console.WriteLine("1) Create item:");
            Console.WriteLine("2) Destroy last item:");
            Console.WriteLine("3) Exit:");
            choice = int.Parse(Console.ReadLine());
            switch (choice)
            {
                case 1:
                    Console.Write("Name of new item:");
                    items obj = new items(Console.ReadLine());
                    item.Add(obj);
                    break;
                case 2:
                    if (item.Count > 0)
                    {
                        item[new item.Count - 1].RemoveOne(); /*<<error*/
                        item.RemoveAt(item.Count - 1);
                    }
                    break;
                case 3:
                    Console.WriteLine("Total number of items:" + items.getTotal()); /*<<error*/
                    Environment.Exit(0);
                    break;
                default:
                    break;
            }
        }
    }
}
class items
{
    //write your code here
    private string name;
    private int number;

    public items(string a)
    {
        this.name = a;
        this.number++;
        Console.WriteLine("successfully created");
    }
    public void RemoveOne()
    {
        Console.WriteLine(this.name);
        this.number = this.number + 1;   
    }
    public int getTotal()
    { 
        return number;
    }

}
} 

非静态字段需要对象引用

有些字段、属性和方法是实例范围的,有些是静态的。您需要保持一致,以便他们能够相互访问。

静态的东西意味着它与类本身相关联。当某个东西不是静态的时,它与类的特定实例相关联。

考虑到您正在处理的内容,我建议您从getTotal():中删除static

public int getTotal()
{ 
    return number;
}

如果我删除了静态修饰符,那么我在调用items.getTotal()时会遇到问题。如果我将其添加回方法中,那么我会在返回数字字段时遇到问题。

我不确定你指的是哪一个"静态修饰符"。如果你把它从getTotal()中删除,我看不到任何明显会破坏的东西。如果确实发生了什么,请用中断的特定行更新您的问题。

更新

线路

item[new item.Count - 1].RemoveOne(); /*<<error*/

不应该包含new关键字。只需item.Count - 1就会为您提供item中最后一个元素的索引。

线路

items.getTotal()

会给您带来问题,因为items是类的名称,而不是变量。该语法将尝试在名为getTotal()的类上调用静态方法。你可能是指

item.getTotal()

它指的是您实例化的CCD_ 7。

另请参阅以下关于套管的说明。这将使避免此类问题变得更加容易。

关于样式

我建议您遵循C#编码约定,该约定指定类和方法应为CamelCase,例如

class Items
{
    public int GetTotal()
    { 
        return number;
    }
}

遵循这个约定会使您的代码更容易被其他人阅读,对您来说也是如此。

    public static int getTotal()
    { 
        return number;
    }

您不能在getTotal中引用数字,因为数字是实例成员,而getTotal是静态的。静态成员是在类型级别定义的,因此不知道特定的基于实例的成员,因此从静态类型引用实例成员是无效的。

问题是静态方法getTotal()获取私有int数的默认值

您必须使数字字段为静态字段,或者使方法getTotal()为非静态字段。

您必须创建项类的实例,然后从该实例中调用getTotal()方法。

示例

item myItem = new item();
myItem.getTotal();