C#变量范围阻止了我的脚步

我对编程相当陌生。 当我用C语言为自己尝试任何东西时,我一直面临的问题是范围。

有什么方法可以在不同的方法或类中使用或修改变量吗? 有没有办法做到这一点,而不创建一个类或对象的新实例? 它似乎每次擦拭石板都很干净。

例如,我正在设置一个控制台文本游戏,并且我想要以特定的时间间隔向控制台写入不同的背景消息。

public static void OnTimedEvent(object scource, ElapsedEventArgs e) 
{   
    if(Exposition.Narration == 1)
    {
        Console.WriteLine("The bar is hot and muggy");
    }   

    if (Exposition.Narration == 2)
    {
        Console.WriteLine("You see someone stealing beer from the counter");
    }

    if (Exposition.Narration == 3)
    {
        Console.WriteLine("There is a strange smell here");
    }
}

但我无法播放不同的信息。 如果我从方法内部创建变量,它会在每次运行时将该变量发送给它的defult。 如果我创建了一个对象或类的新实例,它也会将事情发回到defult。 另外,当我一直创建新实例时,我无法修改单个类。

这只是其中一个问题出现的一个例子。 有没有办法在更广的范围内拥有可扩展性? 或者我在想这个错误的方式?

编辑:

简单地说,我可以从不同的方法或类中读取或更改变量吗?

使用系统;

namespace Examp
{
    class Program
    {
        public static void Main(string[] args)
        {

            int number = 2;
            other();
        }


        public static void other()
        {
            if (Main.number == 2)
            {
                number = 3
            }
        }

    }
}

虽然我不认为我完全理解了你的问题,但你可以在这里看到一些方法来让一个变量在方法之外“坚持”:

静态变量

静态变量就像一个全局变量。 如果您将它们设置为公共,您可以通过所有程序查看它们(如果将它们设置为内部,则不同)。

一个静态变量可以定义为:

class MyClass
{
    static int MyVariable = 4;
}

....somewhere...
void MyMethod()
{
    MyClass.MyVariable = 234;
}

正如你所看到的,你可以在任何地方访问它们。

堆上的变量

如果使用new运算符创建一个对象,如果继续引用该对象,则对其执行的每个修改都反映在所有对该对象的引用中。 例如

class MyClass
{
    int X;
}

static class Program
{
    static void Main(string args[])
    {
        MyClass a = new MyClass();
        a.X = 40;
        Method1(a);
        Method2(a);
        Console.WriteLine(a.X.ToString()); // This will print 32
    }

    static void Method1(MyClass c)
    {
        c.X = 10;
    }

    static void Method2(MyClass c)
    {
        c.X = 32;
    }
}

你甚至可以使用ref来编辑你的方法中的变量

基本上你误解了“范围”的概念,因为你的问题是“哪些变量类型存在”(全局/静态/本地等)。 你想知道范围的是这样的:局部变量只存在于定义它的地方。

我希望这给你一些建议。 答案肯定不完整,但可以给你一个想法。

尝试更具体,以便我可以改变我的答案。

回答编辑1:

不,您不能以您想要的方式更改变量,您必须将其添加到类(在此情况下为程序),请尝试添加:

class Program
{
    static int number;
    ....
}

很明显,你应该删除Main方法中的一个。

还要注意,如果将int作为参数传递,因为它们被复制,所以int不能在函数内部修改(除非没有ref)。

原因很简单:对Class实例的引用(至少)与int的引用大小相同(如果我们讲的是32/64位系统),所以需要同时复制或引用它。

如果需要,您可以在完成计算后从方法返回值,如下所示:

int x = 3;
x = DoSomethingWithX(x);

int DoSomethingWithX(int x)
{
    x += 30;
}

类访问修饰符允许您控制想要该类暴露给其他类的成员。 此外,具有单例模式的静态类允许用于在应用程序中重用相同的实例。

看看你的例子,看起来你只是试图读取类成员,因此你的类中的公共属性应该足够了。 可以在初始化存在OnTimedEvent方法的类时传递此类的实例(应将此方法更改为实例方法以访问您的类的非静态成员)。

例如,

class MyClass
{
    private Exposition exposition;

    // Option 1: Use parametrized constructor
    // Pass the instance reference of the other class while 
    // constructing the object
    public MyClass(Exposition exposition)
    {
        this.exposition = exposition;
    }

    // Option 2: Use an initialize method
    public void Initialize(Exposition exposition)
    {
        this.exposition = exposition;
    }

    // Remove static to access instance members
    public void OnTimedEvent(object scource, ElapsedEventArgs e) 
    {   
        // Better to use an enumeration/switch instead of magic constants
        switch(exposition.Narration)
        { 
             case HotAndMuggy:
                 Console.WriteLine("The bar is hot and muggy");;
                 break;
             ...
        }
    }     

    // Option 3: Use static properties of the Exposition class
    // Note this approach should be used only if your application demands 
    // only one instance of the class to be created        
    public static void OnTimedEvent_Static(object scource, ElapsedEventArgs e) 
    {   
        // Better to use an enumeration/switch instead of magic constants
        switch(Exposition.Narration)
        { 
             case HotAndMuggy:
                 Console.WriteLine("The bar is hot and muggy");;
                 break;
             ...
        }
    }        
}
链接地址: http://www.djcxy.com/p/20671.html

上一篇: C# Variable Scope stopping me in my tracks

下一篇: changing address of object in Java (pass