演员表演中的不同行为?

时间:2015-05-17 11:47:02

标签: c# casting implicit explicit sender

有人可以向我解释为什么在下面的两个演员场景中,演变的变量有何不同?第一个变量(double initial)在第一个示例代码中保留其初始值,而#34; sender" object根据输入的新变量更改其内容属性值吗?

第一名:

double initialValue = 5;

int secValue = (int)initial;

secValue = 10;

Console.WriteLine(initial); // initial value is still 5.

第二个例子:

private void Button_Click(object sender, RoutedEventArgs e)
{
    Button btn = (Button)sender;
    btn.Content = "Clicked"; // "sender" objects content property is also set to "Clicked".
}

1 个答案:

答案 0 :(得分:4)

这与铸造无关。这是值类型引用类型之间的区别。 int是值类型,Button是引用类型:

int a = 1;
int b = a;  // the value of a is *copied* to b

Button btnA = ...;
Button btnB = btnA;  // both `btnA` and `btnB` point to the *same* object.

简单来说,值类型包含一个值,引用类型引用一些对象。插图:

  a       b      btnA     btnB
+---+   +---+     |        |
| 1 |   | 1 |     |        +---------+
+---+   +---+     |                  v
                  |             +-------------+
                  +-----------> |  The button |
                                +-------------+

以下问题包含有关此问题的更多详细说明:

请注意,在第一个示例中,您重新分配 secValue的值。您也可以对参考类型执行相同的操作:

b = 2;
btnB = someOtherButton;

  a       b      btnA     btnB
+---+   +---+     |        |              +-------------------+
| 1 |   | 2 |     |        +------------> | Some other button |
+---+   +---+     |                       +-------------------+
                  |     +-------------+
                  +---> |  The button |
                        +-------------+

在第二个示例中,您只是修改按钮的属性,而不是更改变量指向的对象。