为什么可以';我在C#中声明一个外部变量吗?
我需要在为什么可以';我在C#中声明一个外部变量吗?,c#,variables,external,block,declare,C#,Variables,External,Block,Declare,我需要在if语句中声明一个变量。那我就在外面用。但据我所知,C#中没有外部变量。但我必须这样做 我有两个类,都是从一个类派生出来的 基类:操作数 派生类:NormalOperandSpecialOperand bool normal 在某处宣布 if(normal) NormalOperand o = stack.Pop() as NormalOperand; else SpecialOperand o = stack.Pop() as SpecialOperand; 我不想
if
语句中声明一个变量。那我就在外面用。但据我所知,C#中没有外部变量。但我必须这样做
我有两个类,都是从一个类派生出来的
基类:操作数
派生类:NormalOperand
SpecialOperand
bool normal
在某处宣布
if(normal)
NormalOperand o = stack.Pop() as NormalOperand;
else
SpecialOperand o = stack.Pop() as SpecialOperand;
我不想在下面讨论这些差异。有什么黑客可以做到这一点吗?还是我必须在任何与此相关的地方处理它?我看不出问题所在,只是将
o
声明为基类操作数
Operand o = stack.Pop(); // add as Operand if needed
Operand o = Stack.Pop();
稍后,如果您需要知道o
的类型(在基类上使用虚拟/抽象方法应避免这种情况),请使用:
if (o is NormalOperand)
{
// TODO: maybe check for null
(o as NormalOperand).NormalSpecificMethod();
}
我不认为有什么问题,只需将o
声明为基类操作数
Operand o = stack.Pop(); // add as Operand if needed
Operand o = Stack.Pop();
稍后,如果您需要知道o
的类型(在基类上使用虚拟/抽象方法应避免这种情况),请使用:
if (o is NormalOperand)
{
// TODO: maybe check for null
(o as NormalOperand).NormalSpecificMethod();
}
据我所知,您希望将此类变量声明为外部变量的唯一原因是,您希望对它们调用不同的方法
例如:
normal = true;
...
o.DoSomethingNormal()
normal = false;
o.DoSomethingSpecial();
如果你看了这段代码,意识到C#是一种静态类型的语言,你就会明白这是无法编译的
但是,如果您想调用一个在普通和特殊上都声明的方法,您可以在接口或基类中声明该方法,并将stack.Pop()强制转换为该类型。这样,你将使用多形性,它将起作用
就你而言:
Operand o = stack.Pop() as Operand;
o.DoSomething();
据我所知,您希望将此类变量声明为外部变量的唯一原因是,您希望对它们调用不同的方法
例如:
normal = true;
...
o.DoSomethingNormal()
normal = false;
o.DoSomethingSpecial();
如果你看了这段代码,意识到C#是一种静态类型的语言,你就会明白这是无法编译的
但是,如果您想调用一个在普通和特殊上都声明的方法,您可以在接口或基类中声明该方法,并将stack.Pop()强制转换为该类型。这样,你将使用多形性,它将起作用
就你而言:
Operand o = stack.Pop() as Operand;
o.DoSomething();
您应该能够做到:
bool normal = ...
Operand o = null;
if (normal) o = stack.Pop() as NormalOperand; Enter code here`else o = stack.Pop() as SpecialOperand;
但我不确定我是否理解。我的意思是,只有当您需要在if
-语句中执行其他操作时,这才有意义。否则,正如George所建议的,您可以始终执行o=stack.Pop()
,然后使用as和null检查类型。您应该能够执行以下操作:
bool normal = ...
Operand o = null;
if (normal) o = stack.Pop() as NormalOperand; Enter code here`else o = stack.Pop() as SpecialOperand;
但我不确定我是否理解。我的意思是,只有当您需要在if
-语句中执行其他操作时,这才有意义。否则,正如George所建议的,您可以始终执行o=stack.Pop()
,然后使用as和null检查类型。通常,您应该在if语句之前声明变量,将其声明为操作数。在这种情况下,您根本不需要if语句,也不需要布尔正常值。只需将它声明为一个操作数
,并使用多态性来执行您需要执行的任何其他操作
Operand o = stack.Pop() as Operand;
正如您所说,您不想处理下面的差异,您不需要知道o是否特别。或者是吗?通常,应该在if语句之前声明变量,将其声明为操作数。在这种情况下,您根本不需要if语句,也不需要布尔正常值。只需将它声明为一个操作数
,并使用多态性来执行您需要执行的任何其他操作
Operand o = stack.Pop() as Operand;
正如您所说,您不想处理下面的差异,您不需要知道o是否特别。或者你呢?对于初学者来说,你的例子没有任何意义,因为这两个临时变量都消失了。但让我们忽略这一点
假设这些操作数位于同一堆栈上,我们可以假定它们都是从公共类派生的。我假设这是操作数
Operand o = stack.Pop(); // add as Operand if needed
Operand o = Stack.Pop();
现在,我还假设你想用这段代码做点什么。这是怎么一回事?你为什么要知道?如果你真的只想知道它是什么类型,你可以说:
if(o.GetType() == typeof(NormalOperand))
{
}
else if(o.GetType() == typeof(SpecialOpernad))
{
}
首先,您的示例没有任何意义,因为这两个临时变量无论如何都会消失。但让我们忽略这一点
假设这些操作数位于同一堆栈上,我们可以假定它们都是从公共类派生的。我假设这是操作数
Operand o = stack.Pop(); // add as Operand if needed
Operand o = Stack.Pop();
现在,我还假设你想用这段代码做点什么。这是怎么一回事?你为什么要知道?如果你真的只想知道它是什么类型,你可以说:
if(o.GetType() == typeof(NormalOperand))
{
}
else if(o.GetType() == typeof(SpecialOpernad))
{
}
很难理解。当然你需要一个虚拟的方法。谢谢,你启发了我。我想我可以更改我的代码,所以我不需要这个“如果”。对不起,我试图让它更清楚,但我的键盘布局不允许。很难理解。当然你需要一个虚拟的方法。谢谢,你启发了我。我想我可以修改我的代码,所以我不需要这个“如果”。对不起,我试图让它更清楚,但我的键盘布局不允许我。我建议使用typeof()。我建议使用typeof()
,你的答案要清楚得多。这意味着我不能在C#中这样做。谢谢,我需要更改我的设计。问题是,即使你可以将变量声明为外部变量,那么你仍然必须选择是调用DoSomethingNormal()还是DoSomethingSpecial(),这样它就不会给你更多的值。不,我将使用运算符重载。如果我能把对象放在正确的参考中,就不会有问题了。我以后会再发一次,并提供更好的解释来帮助其他人。这意味着我不能用C#来做这件事。谢谢,我需要更改我的设计。问题是,即使你可以将变量声明为外部变量,那么你仍然必须选择是调用DoSomethingNormal()还是DoSomethingSpecial(),这样它就不会给你更多的值。不,我将使用运算符重载。