2

私はC#を初めて使用し、コンソールの入力が回文であるかどうかを確認するための小さなアプリケーションを作成していました。一人でかなり遠くまで来ましたが、エラーで行き詰まりました。

コード:

class Program
{
    static void Main(string[] args)
    {
        string str;
        Console.WriteLine("Voer uw woord in:");
        str = Console.ReadLine();

        if (isPalindroom(str) == true)
        {
            Console.WriteLine(str + " is een palindroom");
        }
        else
        {
            Console.WriteLine(str + " is geen palindroom");
        }

    }

    bool isPalindroom(String str)
    {
        string reversedString = "";
        for (int i = str.Length - 1; i >= 0; i--)
        {
            reversedString += str[i];
        }
        if (reversedString == str)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

このエラーが発生します:

エラー1非静的フィールド、メソッド、またはプロパティにはオブジェクト参照が必要です'ConsoleApplication2.Program.isPalindroom(string)' snap 17 17 ConsoleApplication2

にあります:

if (isPalindroom(str) == true)

あなたが私を少し助けることができれば、私は非常に嬉しいです:)

4

8 に答える 8

5

メソッドにstatic修飾子を追加するだけです。isPalindroom

そうでない場合はisPalindroom、インスタンスで呼び出すことができる「インスタンス」メソッドになりProgramます。

簡単に言うと、Programの種類の変数がないため(メインメソッド自体は静的です)、非静的メソッドを呼び出すことはできません。

静的メソッドは、型自体で(Program.isPalydroom(xxx)またはクラス内の他のメソッドから)呼び出すことができます。

于 2012-09-04T14:18:48.947 に答える
3

関数を静的にします。

static bool isPalindrome(String str)
{
}

このMain()メソッドは(要件により)静的であるため、静的メンバーのみを呼び出すことができます。

また、あなたbool isPalindrome()は「純粋」関数であるため、つまり、パラメーターからのデータのみを必要とするため、静的にすることができます。

小さな落とし穴:メソッド名には常にPascalCasingを使用します、IsPalindrome

于 2012-09-04T14:18:07.743 に答える
1

成功する;

static bool isPalindroom(String str)
{
 ....
}

Mainルーチンは静的であるため、プログラムクラスのインスタンスに含まれておらず、インスタンスメソッドを呼び出すことはできません。isPalindroomを静的ルーチンにすると、これが修正されます。

静的メソッドとクラスの詳細については、以下を参照してください。

http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx

于 2012-09-04T14:19:36.307 に答える
1

変化する bool isPalindroom(String str)

static bool isPalindroom(String str)

于 2012-09-04T14:18:14.770 に答える
1

「isPalindrome」の宣言を「staticboolisPalindrome(String str)」に変更するか、Mainでインスタンス化してそこから呼び出すことができるクラスインスタンスのメソッドとして挿入する必要があります。

于 2012-09-04T14:18:36.650 に答える
1

メインは静的です..あなたの機能

  bool isPalindroom(String str) 

する必要があります

static  bool isPalindroom(String str) 
于 2012-09-04T14:18:50.050 に答える
1

他の人がすでに述べたように、isPalindroom()メソッドを静的にする必要があります。

ここに、文字列を逆にする方法についての簡単なメモがあります。

C#の文字列は不変です。つまり、新しい文字列(または文字)を既存の文字列に連結するたびに、まったく新しいオブジェクトが作成されます。したがって、逆のルーチンをより効率的にするために、とを使用することをお勧めしStringBuilderますStringBuilder.Append()

それとは別に、代わりに:

string reversedString = "";
for (int i = str.Length - 1; i >= 0; i--)
{
    reversedString += str[i];
}

次のように入力するだけです。

string reversedString = new string(str.Reverse().ToArray())
于 2012-09-04T14:26:42.373 に答える
1

ここに行く、より良い文化/ケース/正規化の影響を受けないバージョン

using System.Globalization;

bool IsPalindrome(string value, StringComparer comparer = null)
{
    if (s == null)
    {
        throw new ArgumentNullException("value");
    }

    if (comparer == null)
    {
        comparer = StringComparer.CurrentCultureIgnoreCase;
    }

    var elements = new List<string>();
    var m = StringInfo.GetTextElementEnumerator(value);
    while (m.MoveNext())
    {
        elements.Add(m.GetTextElement());
    }

    var i = 0;
    var j = elements.Count - 1;
    var limit = elements.Count / 2;
    for(; i <= limit; i++, j--)
    {
        if (!comparer.Equals(elements[i], elements[j]))
        {
            return false;
        }
    }

    return true;
}
于 2014-12-11T12:35:56.307 に答える