0

わかりました。refパラメーター、配列、メソッドの使用を含むC#クラスからラボを行っています。これをしている間に私が遭遇するいくつかの問題があり、私は助けを求めています。だから..最初に、私が抱えている問題を説明するのに役立つように、問題を最も単純なチャンクに変更しました。簡略化されたコードは次のとおりです。

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]);
    }
}

ここで、uがコードをコンパイルしようとすると、「非静的メンバー'Repository.titles'にアクセスするにはオブジェクト参照が必要です」というエラーが表示されるため、コンパイルできないことに気付きます。問題は、3つのメソッドの形式が、割り当てで指示されたとおりに正確に投稿されている必要があることです。では、このテンプレートを所定の位置に保持しながら、この問題を回避するにはどうすればよいですか?

その他の質問ですが、メソッドdisplayBooksのコンテンツをメインでどのように表示しますか?(私は問題のためにここまで到達していません)。

よろしく、そして助けてください!

- - - - - - - - - - - - 助けてくれてありがとう !!!---------

4

3 に答える 3

1

最初の質問では、titles静的にします。

private static string[] titles;
于 2011-09-05T22:50:27.057 に答える
1

まず、内に存在するrefの値を変更する場合を除いて、を使用する必要はありません。次のコードは、概念を示しています。titleMain()

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);
于 2011-09-05T22:53:01.430 に答える
1

まず最初に、まだ初期化されていないtitlesという配列のインデックス0にtitleを割り当てようとしています。基本的に、値を割り当てようとしているときはnull配列です。

この問題を解決する簡単な方法は、次のようにコードを変更することです。

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>初期サイズを定義せずに追加できるaを使用します。

titles配列をサイズに設定するには、次のようにします。static string[] titles = new string[50];

このプログラムが何をしようとしているのかを見ていくと、追加する必要のあるロジックがさらにあります。titles配列内の次のインデックスにタイトルを追加するためのカウンター変数など。

于 2011-09-05T22:53:45.440 に答える