为什么我的bool属性没有使用C#中的Get / Set接收值?

时间:2014-07-18 15:07:30

标签: c# properties get set

出于某种原因,我似乎无法使用NoMoreWords从班级checkSpell中更改班级manageWords中的媒体资源Get/Set的值。

完整的代码如下,但重要的一点在这里。

checkSpell中有一个名为NoMoreWords的bool属性。 然后,我在checkSpell中创建manageWords对象的实例,并将属性NoMoreWords更改为true。我的观察窗口证明manageWords中的值已更改,但一旦我回到checkSpellNoMoreWords仍为假。

你能发现问题并指出正确的方向吗?感谢。

这是checkSpell

class checkSpell
{

    public bool finished = false;

    public bool NoMoreWords { get; set; }

    public void getWord()
    {

        manageWords mngit = new manageWords();
        speakIt spk = new speakIt();

        do
        {

            string word = mngit.readFile();     // Open the file and gets the word

            if (NoMoreWords == true)
            {
                Console.WriteLine("NoMoreWords is TRUE");
                break;
            }

            //if (word == string.Empty) break;


            Console.WriteLine();

            Console.WriteLine("Write the word: {0}", word.ToUpper());
            //spk.sayThis("Write the word: " + word);
            Console.Write(">");

            char[] a = word.ToCharArray(); //Converts string into chars

            getLetter(a); // METHOD



          //  if (finished == true) break;               

            System.Threading.Thread.Sleep(30);

            //spk.sayThis("Correct!");

            Console.WriteLine("");

        } while (!finished);

        Console.WriteLine("XXXX Bye Bye");
        spk.sayThis("Bye Bye");

    }


    /************************************************************************************************************************
     * Goes through the word (as a char[]) and compare with the typed letters                                               *
     ************************************************************************************************************************/

    public void getLetter(char[] a)
    {

        int b = 0;
        ConsoleKeyInfo k;
        ConsoleColor orig = Console.ForegroundColor;
        int CL = Console.CursorLeft;
        int CT = Console.CursorTop;
        string capOut = "";

        for (int i = b; i < a.Length; i = +b)
        {
            k = Console.ReadKey(true);

            if (k.Key == ConsoleKey.Escape)
            {
                finished = true;
                break;
            }

            if (k.KeyChar == a[i])
            {
                Console.ForegroundColor = orig;
                capOut = k.KeyChar.ToString().ToUpper();

                Console.Write(k.KeyChar.ToString().ToUpper());
                b++;
                CL = Console.CursorLeft; //Get the cursor position of the last correct letter 
                CT = Console.CursorTop;

            }
            else if (k.Key == ConsoleKey.Backspace)
            {

                if (Console.CursorLeft > CL) Console.SetCursorPosition(Console.CursorLeft - 1, CT);
                ConsoleColor bg = Console.BackgroundColor;
                Console.ForegroundColor = bg;
                Console.Write(" ");
                Console.CursorLeft = Console.CursorLeft - 1;

            }
            else if (k.Key == ConsoleKey.Enter)
            {
                // i don't want to change line
            }

            else
            {

                Console.ForegroundColor = ConsoleColor.Red;
                Console.Write(k.KeyChar.ToString().ToUpper());
                Console.ForegroundColor = orig;

            }

        }

    }

现在manageWords

 class manageWords // Check file, open and edit it
{

    public int lineNumber;

    //Check if file exists
    public string readFile()
    {

        string CurrentLine = "";
        int count = 0;

        checkSpell ckt = new checkSpell();

        try
        {


            START:

            count = File.ReadLines(Path.Combine(Environment.CurrentDirectory, "words.txt")).Count(); // Gets number of lines

            var lines = File.ReadLines(Path.Combine(Environment.CurrentDirectory, "words.txt"));

            if (lineNumber < count)
            {
                CurrentLine = lines.Skip(lineNumber).First();
                lineNumber++;
            }
            else 
            {
                ckt.NoMoreWords = true;
                Console.WriteLine("");
                Console.WriteLine("Do you want to play it again? Yes/No: ");
                if (Console.ReadLine() == "yes")
                {
                    lineNumber = 0;
                    goto START;

                }
                else ckt.NoMoreWords = true;
            } 

        }
        catch (Exception e)
        {
            // Let the user know what went wrong.
            Console.WriteLine("The file could not be read:");
            Console.WriteLine(e.Message);
            // Console.ReadLine();
        }

        return CurrentLine;
    }

}

3 个答案:

答案 0 :(得分:1)

这里的原因是你有两个checkSpell个实例。

  • checkSpell的getWord方法是一种实例方法,因此它可以访问NoMoreWords属性实例
  • getWord构造一个manageWords类型的新对象并调用readFile
  • manageWords.readFile构建另一个checkSpell实例,实例使NoMoreWords成为true

原始实例,即您调用getWord的实例,没有更改。

也许您应该将原始实例传递给readFile方法,而不是让该方法构造一个新的checkSpell对象实例?

基本上改变你的readFile方法如下:

public string readFile(checkSpell ckt)

然后在调用readFile时传入checkSpell实例:

string word = mngit.readFile(this);

另外请记住删除构建新readFile实例的checkSpell中的行,无论如何你都必须这样做,因为你不能同时拥有ckt参数一个局部变量。

答案 1 :(得分:0)

你的设计有缺陷。

您有checkSpell个班级创建manageWords的实例,并在manageWords.readFile()内调用checkSpell.getWord()。问题是您的manageWords.readFile()正在创建checkSpell的新实例。

它永远不会与您正在观察或期待的实例进行交互。

您可以执行以下操作作为快速入侵,可以满足您的需求,但可能对整个程序的结构无效。

更改manageWords.readFile()以接收checkSpell的实例并使用该实例而不是创建新实例。

public string readFile(checkSpell chkSpell)
{
    string CurrentLine = "";
    int count = 0;

    try
    {
        ....
        if (lineNumber < count)
        {
            CurrentLine = lines.Skip(lineNumber).First();
            lineNumber++;
        }
        else 
        {
            chkSpell.NoMoreWords = true;
            ....
        } 
        ....
    }
    ....
 }

然后从checkSpell.getWord()致电你的readFile()mngit.readFile(this);

答案 2 :(得分:0)

因为manageWords.readFile在自己的本地checkSpell对象(ckt)中创建,所以对此本地对象的任何更改都不会影响调用manageWords.readFile的checkSpell对象。您应该将调用者传递给manageWords.readFile,例如,

public void getWord()
{
    manageWords mngit = new manageWords();
    speakIt spk = new speakIt();

    do
    {
        string word = mngit.readFile(this);     // pass local checkSpell
        // etc

class manageWords // Check file, open and edit it
{
    public int lineNumber;

    //Check if file exists
    public string readFile(checkSpell ckt)
    {
        string CurrentLine = "";
        int count = 0;
        // etc

您还可以将checkSpell对象传递给manageWords构造函数并存储在manageWords中的字段中:

public void getWord()
{
    manageWords mngit = new manageWords(this);     // pass local checkSpell
    speakIt spk = new speakIt();

    do
    {
        string word = mngit.readFile();     // pass local checkSpell
        // etc

class manageWords // Check file, open and edit it
{
    public int lineNumber;
    private checkSpell ckt;

    public manageWords(checkSpell)
    {
        ckt = checkSpell;
    }

    //Check if file exists
    public string readFile()
    {
        // etc