if语句中的变量声明
本文关键字:变量 声明 语句 if | 更新日期: 2023-09-27 18:07:20
在c#中,我正在编写一个相对简单的程序,我试图创建一个事件处理程序函数,将处理多个源,如:
private void fooHandler(object sender, RoutedEventArgs e)
{
fooObject objectFoo = (fooObject)sender;
if (objectFoo.name == "bla1"){
bla1Window bla = new bla1Window();
}
if (objectFoo.name == "bla2"){
bla2Window bla = new bla2Window();
}
.
.
.
else{
//default stuff happens
}
bla.Left = this.Left
bla.Top = this.Top
bla.Show();
this.Close();
}
该函数用于窗口切换。问题是,一旦退出if语句,变量就会超出作用域。我这样做是因为,看看我定义的一系列函数来单独处理每个事件,除了一个变量声明之外,它们都是相同的。是否有一种方法,使这项工作,或者我只是要坚持与每个事件处理程序的功能?
如果bla1Window
和bla2Window
都共享一个基类或接口,您可以这样引用它们。在这种情况下,看起来你只是访问Window
的属性,所以你可以这样做:
Window window = null;
fooObject objectFoo = (fooObject)sender;
if (objectFoo.name == "bla1"){
window = new bla1Window();
}
else if (objectFoo.name == "bla2"){
window = new bla2Window();
}
.
.
.
else{
//default stuff happens
}
window.Left = this.Left
window.Top = this.Top
window.Show();
this.Close();
考虑:
private void fooHandler(object sender, RoutedEventArgs e)
{
fooObject objectFoo = (fooObject)sender;
Window bla; // a super-type or interface, don't assign a value here
// so there will be a compile error if it was
// forgotten below
if (objectFoo.name == "bla1"){
bla = new bla1Window();
} else if (objectFoo.name == "bla2"){
bla = new bla2Window();
} else {
// just make sure to assign to bla
// or there will a compiler error later
}
bla.Left = this.Left
bla.Top = this.Top
bla.Show();
this.Close();
}
我通常会这样写:
Window CreateFromName(string name) {
if (name == "bla1"){
return new bla1Window();
} else if (name == "bla2"){
return new bla2Window();
} else {
// just make sure to return a value
// or there will a compiler error later
}
}
private void fooHandler(object sender, RoutedEventArgs e)
{
fooObject objectFoo = (fooObject)sender;
Window bla = CreateFromName(objectFoo.name);
bla.Left = this.Left
bla.Top = this.Top
bla.Show();
this.Close();
}
快乐编码。
解决方案是简单地将变量提升到它需要在if语句之后使用的范围内。就是这么简单。然而,我还是建议你试着重构一下,或者至少把你的真实代码贴出来,这样我们就可以试一试了。当你有一堆代码在多个if语句中一个接一个地重复时,它通常可以简化为一个或两个方法。
private void fooHandler(object sender, RoutedEventArgs e)
{
fooObject objectFoo = (fooObject)sender;
// use the base class and work with that.
// all windows have the properties you use
// below, so there is no need to declare it
// as a more specific type.
blahWindow bla = null;
if (objectFoo.name == "bla1"){
bla = new bla1Window();
}
if (objectFoo.name == "bla2"){
bla = new bla2Window();
}
.
.
.
else{
//default stuff happens
bla = new BlahDefault();
}
// 'bla' cannot be nbull here if each branch above assigns it
bla.Left = this.Left
bla.Top = this.Top
bla.Show();
this.Close();
}
所有的窗口都应该有一个共享的父窗口。使用子构造函数并将其赋值给父对象,父对象可以在'if'语句之外单独声明。
private void fooHandler(object sender, RoutedEventArgs e)
{
Window bla = null;
fooObject objectFoo = (fooObject)sender;
if (objectFoo.name == "bla1"){
bla = new bla1Window();
}
if (objectFoo.name == "bla2"){
bla = new bla2Window();
}
.
.
.
else{
//default stuff happens
}
if(bla != null)
{
bla.Left = this.Left
bla.Top = this.Top
bla.Show();
this.Close();
}
}
您真的想让它成为一个接口,并在if
代码之前声明该接口。看起来下面bla
上调用的所有方法都是通用的,这是接口(或抽象类,如果更合适的话)的绝佳候选。
实际上,如果你的代码在这个文件中根本没有切换,并且你在工厂或其他地方通过它,那将是最好的。如果你决定这么做的话,网上有很多关于这方面的信息
我认为你应该确保在if语句之前声明变量。这样你的问题就解决了。示例
public string IfStatement()
{
string myValue = null;
bool condition = true;
if (condition)
{
myValue = "something";
}
else
{
myValue = "something else";
}
return myValue;
}