发件人在C#中

时间:2014-12-31 18:20:06

标签: c# windows xaml

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

3 个答案:

答案 0 :(得分:4)

事件的sender只是作为对象传递给事件处理程序。现在,当引发该事件时,您通常会知道您可以期待什么样的发件人(因为您自己设置了事件处理程序),但该方法仍然需要object类型。

现在as是一种类型转换,它尝试将对象转换为该类型,但如果类型不兼容则返回null。所以在这种情况下,你有这个:

var rectangle = sender as Rectangle;

有两种可能性:

  1. sender是一种可以分配给Rectangle的类型,在这种情况下,rectangle将包含对同一对象的引用,但输入为Rectangle只是object
  2. 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

因此,您提供的代码是检查senderRectangle对象(或派生类型)。然后在使用转换后的变量之前检查null,这在使用as时总是很好。

请注意,第二个代码只是指定一个不同的变量名,但是使用类名作为变量名是强烈不鼓励。