C# if语句中的变量声明
在C#中,对于我正在编写的一个相对简单的程序,我试图创建一个事件处理函数,该函数将处理多个源,如下所示:C# if语句中的变量声明,c#,xaml,variables,if-statement,C#,Xaml,Variables,If Statement,在C#中,对于我正在编写的一个相对简单的程序,我试图创建一个事件处理函数,该函数将处理多个源,如下所示: private void fooHandler(object sender, RoutedEventArgs e) { fooObject objectFoo = (fooObject)sender; if (objectFoo.name == "bla1"){ bla1Window bla = new bla1Window(); } if (
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语句,变量就不在范围内。我这样做是因为,看看我定义的一系列单独处理每个事件的函数,除了单变量声明之外,它们都是相同的。有什么方法可以让它工作,还是我只需要为每个事件处理程序使用一个函数?解决方案是简单地将变量提升到它需要的范围内,以便在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();
}
}
如果
bla1Window
和bla2Window
都共享一个基类或接口,则可以这样引用它们。在本例中,看起来您只是在访问窗口的属性,因此可以执行以下操作:
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
代码之前声明接口。看起来下面在bla
上调用的所有方法都是通用的,这是接口(或者更合适的抽象类)的最佳候选方法
事实上,如果您的代码在这个文件中根本没有切换,并且您可以在工厂或其他地方通过它,这将是最好的。如果你决定这样做,互联网上有很多信息。我认为你应该确保在if语句之前声明变量。
那应该能解决你的问题。
范例
这也行得通,但为什么它比只使用var窗口要好呢?@Will,因为它行得通;-)<代码>变量
需要为其分配初始值,以便它“知道类型”<代码>var objectFoo=(object)null代码>仅如此有用;-)dynamic
没有这个问题,但是…@pst-虽然我认为只使用Window是正确的方法,但是使用var objectFoo=(Window)null;将完成同样的事情。@Chris:那只是因为您仍然通过cast为编译器提供类型。就我个人而言,我会在任何代码审查中拒绝这一行代码(并与编写它的开发人员进行认真的交谈),因为它比只执行windowobjectfoo=null更容易键入,也不太清晰代码>@Reed:我完全同意,我只是指出它会起作用。
public string IfStatement()
{
string myValue = null;
bool condition = true;
if (condition)
{
myValue = "something";
}
else
{
myValue = "something else";
}
return myValue;
}