c# - 数组作为参数传递?

标签 c# interface

我正在学习如何使用 C# 的接口(interface), 我读这篇文章: http://www.codeproject.com/Articles/286863/I-Interface

例子之一:

    public class TaskComposite : ITask
{
    public TaskComposite(params ITask[] tasks)
    {
        this.composedTasks = new List<ITask>();
        if(tasks != null)
        {
            foreach(var task in tasks)
                AddTask(task);
        }
    }

    public void Do()
    {
        foreach(var task in this.composedTasks)
            task.Do();
    }

    public void AddTask(ITask task)
    {
         if(task != null)
             this.composedTasks.Add(task);
    }

    private List<ITask> composedTasks;
} 

描述说:

we can group a load of tasks together to be executed serially.

我创建了一个 Windows 窗体作为创建 TaskComposite 类的一个新实例,但是接下来我应该做什么?

public partial class FormInterface : Form
{
    public FormInterface()
    {
        InitializeComponent();
    }


    private void FormInterface_Load(object sender, EventArgs e)
    {
        ITask[] TaskAry = new ITask[] { };
        TaskAry[0] = new TaskClass().Do(); //<=Error
        TaskComposite tc = new TaskComposite(TaskAry);
    }

    class TaskClass : ITask
    {
        public void Do()
        {
            Console.WriteLine(DateTime.Now.ToString());
        }
    }

}

最佳答案

你这里有几个错误。

首先,当你创建一个数组时,你应该指定它的大小,或者初始化它。这是集合(具有可变大小)和数组之间的区别。所以,你应该提供尺寸

ITask[] TaskAry = new ITask[1]; 
TaskAry[0] = new TaskClass();

或初始化(大小将由编译器计算):

ITask[] TaskAry = new ITask[] { new TaskClass() }; 

但在您的情况下,当使用 params ITask[] tasks 时,您可以简单地传递任务列表:

TaskComposite tc = new TaskComposite(new TaskClass());

图案 Composite允许您将一组对象视为单个对象。在您的情况下,此处的复合任务允许您将多个任务视为一个任务对象。因此,如果没有复合任务,您将需要使用任务数组/集合并手动执行每个任务。像这样:

ITask[] tasks = new ITask[] { new TaskClass(), new TaskClass() };
foreach(ITask task in tasks)
    task.Do();

对于复合任务,您不需要遍历所有任务:

ITask compositeTask = new TaskComposite(new TaskClass(), new TaskClass());
compositeTask.Do(); // executes all tasks

您可以在需要简单 ITask 的地方传递复合任务。而且没有人会知道实际上有一堆任务。

关于c# - 数组作为参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10546912/

相关文章:

c# - serializedObject FindProperty 返回 null

ios - 如何让一个 View Controller 从另一个 View Controller 访问变量?

android - 使用接口(interface)将数据从 Activity 传递到 Fragment

java - 接口(interface)没有构造函数,那怎么继承呢?

javascript - 为什么我的 typescript 接口(interface)被编译为 javascript?

c# - 正则表达式应用 - 匹配百分比

C# 桌面应用程序?

c# - .NET服务失败时,系统是否会记录异常?

c# - MVVM ViewModel 和静态方法

go - 与私有(private)接口(interface)比较