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

“isPalindrome”的声明需要修改为“static bool isPalindrome(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

做了;

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

正如其他人已经提到的,您应该将isPalindroom()方法设为静态。

这里有一个关于你反转字符串的方式的快速说明:

C# 中的字符串是不可变的,这意味着每次将新字符串(或字符)连接到现有字符串时,都会生成一个全新的对象。因此,为了使反向例程更有效,您可能需要使用StringBuilderand 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 回答