【问题标题】:C# variable scope for instantiating a class [duplicate]用于实例化类的 C# 变量范围
【发布时间】:2016-07-10 20:45:57
【问题描述】:

我正在学习 FizzBu​​zz 模型并尝试以尽可能多的面向对象的方式来完成它,刚刚开始学习 C#。 为此,我尝试使用一个名为 MessageStore 的类来存储各种字符串和整数,以便在运行时传递和引用,而无需尽可能地进行硬编码。

我遇到的问题是我认为我没有正确理解如何或在哪里实例化我的类,以便可以在程序中进一步调用它。

我尝试使用MessageStore returnStringProgram 类的顶部进行实例化,并将该实例分配给MainreturnString = new MessageStore(); 内的变量。

我试图在 `FizzOrBuzz 方法的第一部分调用 returnString 实例,但我不能,不确定这取决于范围吗?

显示的错误是Cannot access non-static field, 'returnString' in static context 我已经尝试从Main 构造函数中删除static,但仍然存在问题。

非常感谢任何帮助。

 using System;
using System.CodeDom;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;

namespace FizzBuzz
{
    class Program
    {
        // Instantiating MessageStore
        MessageStore returnString;

        static void Main(string[] args)
        {
           // Assigning instance a variable name
           returnString = new MessageStore();

            PlayFizzBuzz(100);
            MessageHelper(MessageStore.ReturnCompletedMessage());
            Console.ReadLine();
        }

        public static void PlayFizzBuzz(int startNumber)
        {
            for (int i = startNumber; i >= 0; i--)
            {
                if (i == 0)
                {
                    break;
                }
                MessageHelper(FizzOrBuzz(i));
            }
        }

        public static String FizzOrBuzz(int numberInLoop)
        {
            if (MultipleCheck(numberInLoop, MessageStore.ReturnThree()) && MultipleCheck(numberInLoop, MessageStore.ReturnFive()))
            {
                // Trying to call instance with variable name
                return returnString.ReturnFizzBuzz();
            }
            if (MultipleCheck(numberInLoop, MessageStore.ReturnThree()))
            {
                return MessageStore.ReturnFizz();
            }
            if (MultipleCheck(numberInLoop, MessageStore.ReturnFive()))
            {
               return MessageStore.ReturnBuzz();
            }
            else
                return numberInLoop.ToString();
        }

        public static bool MultipleCheck(int numberToAssess, int multiple)
        {
            return (numberToAssess % multiple == 0) ? true : false;
        }


       public static void MessageHelper(string messageText)
       {
           Console.WriteLine(messageText);
       }

        class MessageStore
        {
            public static string ReturnFizz() { return "Fizz!"; }
            public static string ReturnBuzz() { return "Buzz!"; }
            public static string ReturnFizzBuzz() { return "FizzBuzz!"; }
            public static string ReturnCompletedMessage() { return "Looks like we're done here!"; }
            public static int ReturnThree() { return 3; }
            public static int ReturnFive() { return 5; }
        }

    }
}

【问题讨论】:

  • 如果您的基本目的是了解更多有关面向对象的知识,那么 FizzBu​​zz 不是一个很好的选择,因为您最终只会增加复杂性,而不会从 OO 部分中看到太多好处。相反,您需要一些涉及相关对象层次结构的问题(形状和动物是典型示例)。

标签: c# constructor fizzbuzz


【解决方案1】:

将此行设为静态

static MessageStore returnString;

这是因为您的所有函数都是静态的,因此它们只能访问静态类成员,因此最简单的解决方案是将对象标记为静态,因为您一次只有一个实例。

【讨论】:

  • 同时制作FizzOrBuzz方法static,以避免再次出现同样的错误!
  • @NikhilVartak 是的,当我早些时候搞砸的时候,我一定已经改变了,谢谢!
  • 我在尝试拨打 returnString.ReturnFizzBuzz() 时仍然遇到问题。 Cannot be accessed with an instance reference?
  • @RichC 因为您将 MessageStore 中的所有类项都设置为静态,为什么要这样做?要么从所有这些中删除静态,要么像 MessageStore.ReturnFizzBu​​zz() 一样直接使用它
  • @MoustafaS 没什么理由,C# 是全新的。不过,这已经解决了。谢谢
猜你喜欢
  • 2014-08-12
  • 2015-11-15
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多