C#Variable Scope阻止了我的追踪

时间:2011-12-23 02:37:09

标签: c# scope

我对编程很新。当我在基于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。此外,当我一直在创建新的实例时,我无法修改单个类。

这只是其中一个问题的一个例子。有没有办法让范围更广的可变量?或者我是否以错误的方式思考这个问题?

编辑:

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

使用System;

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

            int number = 2;
            other();
        }


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

    }
}

2 个答案:

答案 0 :(得分:2)

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

静态变量

静态变量类似于全局变量。如果你将它们设置为公共的话,你可以通过所有程序查看它们(如果你将它们设置为内部,则它们是不同的。)

静态变量可以定义为:

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;
    }
}

您甚至可以使用refs编辑方法

中的变量

基本上你误解了“范围”的概念,因为你的问题是“存在哪些变量类型”(全局/静态/本地等)。您想了解的关于范围的内容是:局部变量仅存在于定义它的{}内。

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

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

回答编辑1:

不,你不能以你想要的方式改变变量,你必须将它添加到类(在这种情况下是程序),尝试添加:

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

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

另请注意,如果将函数作为参数传递,则无法修改int(函数除外),因为它们是复制的。

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

如果需要,您可以在完成计算后return来自方法的值,如下所示:

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

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

答案 1 :(得分:0)

Class access modifiers允许您控制希望该类向其他类公开的成员。此外,static class singleton pattern允许在您的应用程序中重复使用相同的实例。

看看你的例子,你似乎只是想读取类成员,因此你的类中的公共属性就足够了。在初始化存在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;
             ...
        }
    }        
}