在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语句,变量就会超出范围。我这样做是因为,查看我定义的单独处理每个事件的一系列函数,除了一个变量声明外,它们都是相同的。有没有办法使这项工作,或者我只是必须坚持每个事件处理程序的功能?
答案 0 :(得分:9)
如果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();
答案 1 :(得分:2)
考虑:
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();
}
快乐的编码。
答案 2 :(得分:0)
解决方案是简单地将变量提升到需要在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();
}
答案 3 :(得分:0)
您的所有窗口都应该有共享父级。使用子构造函数并将其分配给父对象,该父对象可以在'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();
}
}
答案 4 :(得分:0)
你真的想让它成为一个接口并在if
代码之前声明接口。看起来下面bla
上调用的所有方法都是常见的,这对于接口(或抽象类,如果更合适)是一个很好的候选者。
事实上,如果你的代码根本没有在这个文件中切换,你通过它在Factory或其他东西中最好。如果您决定走这条路,互联网上有很多信息。
答案 5 :(得分:0)
我认为你应该确保在if语句之前声明变量。 那应该可以解决你的问题。 实施例
public string IfStatement()
{
string myValue = null;
bool condition = true;
if (condition)
{
myValue = "something";
}
else
{
myValue = "something else";
}
return myValue;
}