铸造操作中的不同行为?
Different behaviours in cast operations?
谁能给我解释一下,为什么在下面的两个转换场景中,转换变量的行为不同?虽然第一个变量(双初始值)在第一个示例代码中保留了它的初始值,但 "sender" 对象会根据它被转换成的新变量更改其内容 属性 值?
第一个例子:
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".
}
这与选角无关。这就是值类型和引用类型的区别。 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 |
+-------------+
以下问题对此问题有更详细的解释:
- What is the difference between a reference type and value type in c#?
但请注意,在您的第一个示例中,您正在重新分配 secValue
的值。您也可以对引用类型执行相同的操作:
b = 2;
btnB = someOtherButton;
a b btnA btnB
+---+ +---+ | | +-------------------+
| 1 | | 2 | | +------------> | Some other button |
+---+ +---+ | +-------------------+
| +-------------+
+---> | The button |
+-------------+
在你的第二个例子中,你只是修改了按钮的属性,你没有改变变量指向的对象。
谁能给我解释一下,为什么在下面的两个转换场景中,转换变量的行为不同?虽然第一个变量(双初始值)在第一个示例代码中保留了它的初始值,但 "sender" 对象会根据它被转换成的新变量更改其内容 属性 值?
第一个例子:
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".
}
这与选角无关。这就是值类型和引用类型的区别。 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 |
+-------------+
以下问题对此问题有更详细的解释:
- What is the difference between a reference type and value type in c#?
但请注意,在您的第一个示例中,您正在重新分配 secValue
的值。您也可以对引用类型执行相同的操作:
b = 2;
btnB = someOtherButton;
a b btnA btnB
+---+ +---+ | | +-------------------+
| 1 | | 2 | | +------------> | Some other button |
+---+ +---+ | +-------------------+
| +-------------+
+---> | The button |
+-------------+
在你的第二个例子中,你只是修改了按钮的属性,你没有改变变量指向的对象。