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