调用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
唯一需要的参数是Counter对象的数组Counter[]
,因此预计这将不起作用。您可以将参数的类型更改为IEnumerable<Counter>
。这样做就会奏效。
另一种解决问题的方法是,通过调用ToArray
方法,根据List创建一个数组,然后将其作为参数传递给PrintCounters
。
PrintCounters(mycounters.ToArray());
然而,我更喜欢第一种方法,因为它更通用。一般来说,在接口中编程而不是在实现中编程是一种很好的做法。想想PrintCounters
的实际作用。它只想遍历Counter
对象集合中的项,并只为每个项打印Name
和Count
。如果这是一个数组、一个列表或其他什么,这有关系吗?我们唯一想要的是一个枚举器,以便迭代思考项目。那么,这样做的先决条件是什么呢?唯一的先决条件是将在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);
}
}