调用PrintCounters()没有执行,原因是

本文关键字:执行 PrintCounters 调用 | 更新日期: 2024-07-23 06:37:40

我正在尝试使用PrintCounters()方法打印mycounters[0],但PrintCounters(mycounters[0])似乎不起作用,这是语法问题吗?

using System;
 using System.Collections.Generic;
namespace Counter
 {
class MainClass
{
    List<Counter> counters = new List<Counter>();
    public static void PrintCounters (IEnumerable<Counter> counters)
    {
        foreach (Counter c in counters)
        {
            Console.WriteLine("{0} is {1}", c.Name,c.Count);
        }
    }
    public static void Main (string[] args)
    {
        List<Counter> mycounters = new List<Counter> ();
        mycounters.Add(new Counter ("counter1"));
        mycounters.Add (new Counter ("counter2"));
        mycounters [2] = mycounters [0];
        for (int i = 0; i < 4; i++) {
            mycounters[0].increment ();
        }
        for (int i = 0; i < 9; i++) {
            mycounters[1].increment ();
        }
        PrintCounters (mycounters);
        mycounters [2].reset();
        PrintCounters (mycounters);
    }
}

由于我已经修复了所有的问题,在调试程序时,这里有一条注释显示了upenter图像描述

这是我的类文件,没有错误。

namespace Counter
{
public class Counter
{
    private int _count;
    public int Count
    {
        get{
            return _count;
        }

    }
    private string _name;
    public string Name
    {
        get {
            return _name;
        }
        set{
            _name = value;
        }
    }
    public Counter (string name )
    {
        _name = name;
        _count = 0;
    }
    public void increment()
    {
        _count++;
    }
    public void  reset()
    {
        _count = 0;
    }


}

}

调用PrintCounters()没有执行,原因是

由于PrintCounters唯一需要的参数是Counter对象的数组Counter[],因此预计这将不起作用。您可以将参数的类型更改为IEnumerable<Counter>。这样做就会奏效。

另一种解决问题的方法是,通过调用ToArray方法,根据List创建一个数组,然后将其作为参数传递给PrintCounters

PrintCounters(mycounters.ToArray());

然而,我更喜欢第一种方法,因为它更通用。一般来说,在接口中编程而不是在实现中编程是一种很好的做法。想想PrintCounters的实际作用。它只想遍历Counter对象集合中的项,并只为每个项打印NameCount。如果这是一个数组、一个列表或其他什么,这有关系吗?我们唯一想要的是一个枚举器,以便迭代思考项目。那么,这样做的先决条件是什么呢?唯一的先决条件是将在PrintCounters中传递的类型将实现IEnumerable<Counter>。如果有一次我们通过了List<Counter>,然后改变主意,想要通过Counter[],我们就不必改变PrintCounters方法中的任何内容,因为我们遵循了这个原则!

如果您在函数中使用索引传递参数,即mycounters [0]那么函数定义需要像这样修改

  public static void PrintCounters(Counter counter)
  {
      Console.WriteLine("{0} is {1}", counter.Name, counter.Address);
  }

或者,如果您想将整个mycounters列表作为参数传递,则

  public static void Main (string[] args)
  {
    List<Counter> mycounters = new List<Counter> ();
    mycounters.Add(new Counter ("counter1"));
    mycounters.Add (new Counter ("counter2"));
    mycounters [2] = mycounters [0];
    for (int i = 0; i < 4; i++) {
        mycounters[0].increment ();
    }
    for (int i = 0; i < 9; i++) {
        mycounters[1].increment ();
    }
    PrintCounters (mycounters);
  }
  public static void PrintCounters(IEnumerable<Counter> counters)
    {
        foreach (Counter c in counters)
        {
            Console.WriteLine("{0} is {1}", c.Name, c.Address);
        }
    }