2014-12-31 28 views
-6
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是什么意思?发件人在C#

此代码也适用于var Rectangle=sender as Rectangle

+1

所以你有一个工作代码,并想知道它为什么有效?你有没有试过在C#_中搜索_as运算符? –

回答

1

as运算符试图将参数转换为请求的类型,如果转换/转换失败,返回null。 (MSDN

因此,您提供的代码是检查sender是否是Rectangle对象(或派生类型)。然后在使用转换后的变量前检查是否为空,在使用as时总是很好的做法。

请注意,第二个代码只是分配给不同的变量名称,虽然使用类名称作为变量名称是强烈劝阻。

4

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

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

var rectangle = sender as Rectangle; 

有两种可能性:

  1. sender是可以被分配到一个Rectangle一个类型,在这种情况下,rectangle将包含对一个参考相同的对象,但类型为Rectangle,而不是仅仅object
  2. sender是一些其他类型的,在这种情况下rectanglenull,它被捕获在下面的检查。
2

你有一些真正的基本概念,你试图去理解。我会尝试打破这个问题并澄清一些问题,并添加到您收到的两个特殊答案中。

演员:

铸造概念概念是非常重要的,因为这个概念是在你的数据的修改势在必行。你的具体问:

Explicit conversions (casts): Explicit conversions require a cast operator. Casting is required when information might be lost in the conversion, or when the conversion might not succeed for other reasons. Typical examples include numeric conversion to a type that has less precision or a smaller range, and conversion of a base-class instance to a derived class.

在你的例子中,你的实施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? - 允许一个int一个null
  • 它也不会破坏你的应用程序,因为失败的转换将返回null

铸造另一种方法是应用(int)(string)的数据明确强制到类型。所以它会或者成功和或者抛出异常。例如:

实施例(d):

string invalid = "Fail" 
int? number = (int?)invalid; 

这将导致无效转换异常被抛出。 实例(C)实例(D)铸造之间的差异的两个简单比较。

希望这可以为您提供更好的信息。

相关问题