发送方,如 C# 中的发件人
本文关键字: | 更新日期: 2023-09-27 18:35:59
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
。
事件的sender
只是作为对象传递给事件处理程序。现在,当引发该事件时,您通常知道可以期待哪种类型的发送者(因为您自己设置了事件处理程序),但该方法仍然需要object
类型。
现在,as
是一个类型转换,它尝试将对象转换为该类型,但如果类型不兼容,则返回null
。所以在这种情况下,你有这个:
var rectangle = sender as Rectangle;
有两种可能性:
-
sender
是一种可以分配给Rectangle
的类型,在这种情况下,rectangle
将包含对同一对象的引用,但类型化为Rectangle
而不仅仅是object
-
sender
属于其他类型,在这种情况下,rectangle
将被null
,这将在以下检查中捕获。
as
运算符尝试将参数转换为请求的类型,如果转换/强制转换失败,则返回null
。(MSDN)
因此,您提供的代码正在检查sender
是否是Rectangle
对象(或派生类型)。然后,它会在使用转换后的变量之前检查 null,这在使用 as
时始终是一种很好的做法。
请注意,第二个代码只是分配给不同的变量名,但强烈建议不要使用类名作为变量名。
你有一些非常非常基本的概念,你试图理解。 我将尝试通过一些澄清来分解这个问题,并补充您收到的两个特殊答案。
投:
强制转换的概念非常重要,因为此概念在修改数据时势在必行。 您的具体询问:
显式转换(强制转换):显式转换需要强制转换运算符。当信息可能在 转化,或者当其他转化可能不成功时 原因。 典型示例包括数值转换为 精度较低或范围较小,并且转换了基类 实例到派生类。
在您的示例中,您实现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;
这将导致引发无效强制转换异常。 示例 (C) 和示例 (D) 是铸件之间差异的两个简单比较。
希望这能为您提供更好的信息。