为什么我必须到处使用静态?以及如何避免它?

时间:2017-03-18 15:12:40

标签: c# class static instance

我正在用C#编写一个小程序,一开始我注意到Visual Studio抱怨在静态函数(包括main)中只使用静态变量和静态函数调用。我之前编码过,虽然我必须提到我之前编码,但我不记得被迫在任何地方使用静态。这是代码:

class Program
{
    string word = "asd";
    static List<string> words = new List<string>();

    static void Main(string[] args)
    {

        OpenFile();
        Debug.WriteLine(words.Count);
        anagram();

    }

    public static void OpenFile()
    {

        using (var fileStream = File.OpenRead("wordlist.txt"))
        using (var streamReader = new StreamReader(fileStream))
        {
            String line;
            while ((line = streamReader.ReadLine()) != null)
            {
                words.Add(line);
            }

        }

    }

    public void anagram()
    {

        Console.WriteLine(word);

    }

}

我收到了错误&#34;错误CS0120非静态字段,方法或属性需要对象引用&#39; Program.anagram()&#39; &#34;我只是不明白为什么?此外,我也想使单词变量非静态,但由于该方法是静态的,我在其中使用它&#34;必须是&#34;。有什么方法可以避免这种情况吗? 我想我对静电有什么了解,但我不想在这里使用它。

任何帮助都表示感谢,并提前致谢。

2 个答案:

答案 0 :(得分:2)

您可以将逻辑定义到另一个类中,并创建它的实例并使用其成员。

public class MyClass
{
    string word = "asd";
    public List<string> Words = new List<string>();

    public void OpenFile()
    {
        using (var fileStream = File.OpenRead("wordlist.txt"))
        using (var streamReader = new StreamReader(fileStream))
        {
            String line;
            while ((line = streamReader.ReadLine()) != null)
            {
                Words.Add(line);
            }
        }
    }

    public void anagram()
    {
        Console.WriteLine(word);
    }
}

然后你的主要方法是这样的:

static void Main(string[] args)
{
    var m = new MyClass();
    m.OpenFile();
    Debug.WriteLine(m.Words.Count);
    m.anagram();
}

您应该阅读有关访问修饰符以及静态成员和实例成员如何不同的更多信息。

答案 1 :(得分:1)

你可以写这样的课:

class Program
{
    public string word = "asd";
    public List<string> words = new List<string>();

    static void Main(string[] args)
    {
        var program = new Program();
        program.OpenFile();
        Debug.WriteLine(program.words.Count);
        program.anagram();

    }

    public void OpenFile()
    {

        using (var fileStream = File.OpenRead("wordlist.txt"))
        using (var streamReader = new StreamReader(fileStream))
        {
            String line;
            while ((line = streamReader.ReadLine()) != null)
            {
                this.words.Add(line);
            }

        }

    }

    public void anagram()
    {   
        Console.WriteLine(this.word);
    }

}

静态方法对于类是通用的 - 如果要使用非静态方法,则需要实例化它的实例。