Нужна помощь с использованием REF и массивов и методов - PullRequest
0 голосов
/ 06 сентября 2011

Хорошо, я делаю свою лабораторию из класса 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 методов должен быть точно таким же, как указано в задании.Теперь, как я могу избежать этой проблемы, сохраняя этот шаблон на месте?

Другой вопрос, как бы я отображал содержимое метода displayBooks в main?(Я не получил это далеко из-за проблем).

С уважением, и, пожалуйста, помогите!

----------------------- СПАСИБО ЗА ПОМОЩЬ !!!---------

Ответы [ 3 ]

1 голос
/ 06 сентября 2011

Во-первых, вам не нужно использовать 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);
1 голос
/ 06 сентября 2011

Хорошо, во-первых, вы пытаетесь присвоить заголовок индексу 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>, который можно добавить без определения начального размера.

Чтобы установить размер массива титров, просто сделайте это: static string[] titles = new string[50];

Рассматривая то, что собирается делать эта программа, нужно добавить больше логики. Например, переменная счетчика для добавления заголовка к следующему индексу в массиве titles.

1 голос
/ 06 сентября 2011

Для первого вопроса сделайте titles статическим:

private static string[] titles;
...