非静态字段需要对象引用

时间:2014-10-21 02:36:40

标签: c#

我似乎无法弄清楚出了什么问题。

如果我删除静态修饰符然后我有一个问题当我调用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;
    }



}

} 

3 个答案:

答案 0 :(得分:1)

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

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

鉴于您似乎正在处理的内容,我建议您从getTotal()中删除static

public int getTotal()
{ 
    return number;
}
  

如果我删除静态修饰符然后我有一个问题,当我调用items.getTotal()如果我将它添加回方法然后我得到一个问题返回数字字段。

我不确定哪个&#34;静态修饰符&#34;你指的是。如果你从getTotal()中删除它,我看不到任何明显会破坏的东西。如果出现问题,请使用中断的特定行更新您的问题。

<强>更新

该行

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

不应包含new个关键字。只需item.Count - 1即可获得item中最后一个元素的索引。

该行

items.getTotal()

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

item.getTotal()

指的是您实例化的List<items>

另请参阅以下关于套管的说明。这样可以更容易地避免此类问题。

关于风格

我建议您按照C# coding conventions specify that classes and methods shall be CamelCase,例如

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

遵循该约定使您的代码更易于其他人阅读,也适合您。

答案 1 :(得分:0)

    public static int getTotal()
    { 
        return number;
    }

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

答案 2 :(得分:0)

问题是静态方法 getTotal()获取默认值 private int number;

您必须做的是将数字字段设为静态,或使方法 getTotal()为非静态。

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

实施例

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