class 中的属性无法保存,为什么

attribute in class can't be saved why

我正在尝试用 C# 编码,我有两个主要的 classes 第一个是路由器,这是它的实现

public class Router
{
    public int RouterValue = 0;
}

我在另一个名为 Route 的 class 中使用了这个 class,其中包含路由器列表,这是实现:

public class Route
    {
        public List <Router> routers = new();
        bool exitLoop = false;
        public void ReadInput()
        {
            Router router = new();
            Console.WriteLine(" \n Please enter data Input : \n ");
            for (int i = 0; !exitLoop ; i++)
            {
                router.RouterValue = Convert.ToInt32(Console.ReadLine());
                Console.WriteLine("router value" , router.RouterValue);
                routers.Add(router);
                
                if (routers[i].RouterValue == 0)
                {
                    exitLoop = true;
                }
            }
        }
        public void OutPut()
        {
            Console.WriteLine("out put : \n");
            for (int i = 0; i < routers.Count; i++)
            {
                Console.WriteLine(routers[i].RouterValue);
            }
        }
        public int count()
        {
            return routers.Count;
        }
        public int sum(List<Router> _routers)
        {
            int sum = 0;
            for (int i = 0; i < routers.Count; i++)
                sum += _routers[i].RouterValue;
            return sum;
        }
    }

但是当我创建一个 Roue 对象并尝试输入值时,它会将它们打印为零并且总和也等于零,那么问题出在哪里?我调试了它并尝试放置 setter 和 getter 但所有这些都无济于事,有人对此有想法吗?

这是我主要 class 中添加值的部分 :

Routes.Add(op.CreatRoute());
                Routes[^1].ReadInput();
                Routes[^1].OutPut();

您只会创建一个 Router 对象:

Router router = new();

你所做的一切都只是更新那个对象。您输入(终止循环)的 上一个值 0,因此一个 Router 对象曾经拥有的最后一个值是 0

(这是在调试器中逐步执行代码并观察变量的运行时值的好机会。您会发现 Route 对象上的 routers 字段始终具有恰好 一个 元素在其中,无论您重复该循环多少次。)

改为在循环内创建新的 Router 对象:

for (int i = 0; !exitLoop ; i++)
{
    Router router = new(); // <--- here
    router.RouterValue = Convert.ToInt32(Console.ReadLine());
    Console.WriteLine("router value" , router.RouterValue);
    routers.Add(router);
            
    if (routers[i].RouterValue == 0)
    {
        exitLoop = true;
    }
}

这样,循环的每次迭代都会创建(并附加到列表)一个 Router 的全新实例,而不是总是在同一个实例上运行。

顺便说一句,这也是保持变量定义的好做法仅在您需要它们的范围内。这使得代码总体上更简单、更容易理解,并帮助您在应用程序复杂性增加时封装功能。