需要使用REF和数组以及方法的帮助

时间:2011-09-05 22:40:51

标签: c# arrays methods ref

好的,我正在从C#类开始我的实验室,它涉及使用ref参数,数组和方法。在这样做时我遇到了一些问题,我正在寻求帮助。所以..首先,我将问题修改为最简单的块,以帮助我解释我遇到的问题。这是一段简化的代码:

using System;

public class Repository 
{
    string[] titles;

    static void Main(string[] args)
    {
        string title;

        Console.Write("Title of book: ");
        title = Console.ReadLine();

        getBookInfo(ref title);
    }

    static void getBookInfo(ref string title)
    {
        titles[0] = title;
    }

    static void displayBooks(string[] titles)
    {
        Console.WriteLine("{0}", titles[0]);
    }
}

现在,因为你将尝试编译代码,你会注意到无法编译,因为错误说“访问非静态成员'Repository.titles'需要一个对象引用”。问题是3种方法的格式必须与赋值中的告知完全一致。现在,如何在保持此模板的同时避免此问题?

其他问题,如何在main中显示方法displayBooks的内容? (因为问题我没有这么远)。

问候,请帮忙!

-----------------------感谢您的帮助! ---------

3 个答案:

答案 0 :(得分:1)

关于第一个问题,请titles静态:

private static string[] titles;

答案 1 :(得分:1)

首先,您不需要使用ref,除非您想要更改title中存在的Main()的值。以下代码演示了这个概念:

static void Main(string[] args)
{
    string a = "Are you going to try and change this?";
    string b = "Are you going to try and change this?";

    UsesRefParameter(ref a);
    DoesntUseRefParameter(b);
    Console.WriteLine(a); // I changed the value!
    Console.WriteLine(b); // Are you going to try and change this?
}

static void UsesRefParameter(ref string value)
{
    value = "I changed the value!";
}

static void DoesntUseRefParameter(string value)
{
    value = "I changed the value!";
}

需要先创建一个数组才能使用它。所以这是你的代码已被纠正:

static string[] titles;

static void Main(string[] args)
{
    string title;
    titles = new string[1]; // We can hold one value.

    Console.Write("Title of book: ");
    title = Console.ReadLine();

    getBookInfo(title);
}

static void getBookInfo(string title)
{
    titles[0] = title;
}

要显示您的图书,您可以尝试以下方法:

static void displayBooks(string[] titles)
{
    // Go over each value.
    foreach (string title in titles)
    {
        // And write it out.
        Console.WriteLine(title);
    }
}
// In Main()
displayBooks(titles);

答案 2 :(得分:1)

好的,首先,您正在尝试将标题分配给名为titles的数组的索引0,该数组尚未初始化。实际上,当您尝试为其赋值时,它是一个空数组。

解决此问题的快捷方法是修改您的代码:

private static string[] titles;

    static void Main(string[] args)
    {

        string title;

        Console.Write("Title of book: ");
        title = Console.ReadLine();

        getBookInfo(ref title);
        displayBooks(titles);
    }

    static void getBookInfo(ref string title)
    {
        //titles[0] = title;
        titles = new string[] {title};
    }

    static void displayBooks(string[] titles)
    {
        Console.WriteLine("{0}", titles[0]);
    }

如果要为此阵列分配更多书籍并将其打印出来,则需要使用大小初始化阵列。我只想使用List<string>来添加,而无需定义初始大小。

要将titles数组设置为一个大小,只需执行以下操作:static string[] titles = new string[50];

回顾一下这个程序打算做什么,需要添加更多的逻辑。例如一个计数器变量,用于将标题添加到titles数组中的下一个索引。