private void RectangleTapped(object sender, TappedRoutedEventArgs e)
{
RedRectangle.Fill.Opacity = 1.0;
GreenRectangle.Fill.Opacity = 1.0;
BlueRectangle.Fill.Opacity = 1.0;
YellowRectangle.Fill.Opacity = 1.0;
var rectangle =sender as Rectangle;
if (rectangle != null)
{
rectangle.Fill.Opacity =0.25;
}
}
var rectangle=sender as Rectangle
是什么意思?
此代码也适用于var Rectangle=sender as Rectangle
。
答案 0 :(得分:4)
事件的sender
只是作为对象传递给事件处理程序。现在,当引发该事件时,您通常会知道您可以期待什么样的发件人(因为您自己设置了事件处理程序),但该方法仍然需要object
类型。
现在as
是一种类型转换,它尝试将对象转换为该类型,但如果类型不兼容则返回null
。所以在这种情况下,你有这个:
var rectangle = sender as Rectangle;
有两种可能性:
sender
是一种可以分配给Rectangle
的类型,在这种情况下,rectangle
将包含对同一对象的引用,但输入为Rectangle
只是object
sender
属于其他类型,在这种情况下,rectangle
将为null
,这会在以下检查中被捕获。答案 1 :(得分:2)
你有一些非常非常基本的概念,你试图理解。我试图通过一些澄清来解决问题,并添加你收到的两个特殊答案。
<强>角色:强>
cast 的概念性概念非常重要,因为这个概念在修改数据时势在必行。你特别询问:
显式转换(强制转换):显式转换需要强制转换运算符。当信息可能丢失时,需要进行强制转换 转换,或转换可能对其他转换不成功 原因。典型的例子包括数字转换为一种类型 具有较低的精度或较小的范围,以及基类的转换 实例到派生类。
在您的示例中,您实施了as Rectangle
。为简单起见,我将使用更简单的数据类型。转换后as
投射不会产生以下错误:
相反,它会在失败时返回null
,这是一种静默失败的干净方法。在您不希望例外打破用户流量的几种情况下,这可满足特定需求。
示例(A):
int valid = 0;
string number = valid as string;
示例(B):
string valid = 1;
int number = valid as string;
示例(C):
string valid = "valid";
int? number = valid as int?;
这三个例子都是有效的,但在例(C)中你会注意到两个项目:
int?
- null
允许int
。null
。 投射的另一种方法是应用(int)
或(string)
来明确强制数据到类型。因此它将成功和抛出异常。例如:
示例(D):
string invalid = "Fail"
int? number = (int?)invalid;
这会导致抛出 Invalid Cast Exception 。 示例(C)和示例(D)是 cast 之间差异的两个简单比较。
希望这能为您提供更好的信息。
答案 2 :(得分:1)
as
运算符尝试将参数转换为请求的类型,如果转换/转换失败则返回null
。 (MSDN)
因此,您提供的代码是检查sender
是Rectangle
对象(或派生类型)。然后在使用转换后的变量之前检查null,这在使用as
时总是很好。
请注意,第二个代码只是指定一个不同的变量名,但是使用类名作为变量名是强烈不鼓励。