Различное поведение в операциях приведения?

Может ли кто-нибудь объяснить мне, почему в этих двух приведенных ниже сценариях приведения приведенные переменные действуют по-разному? В то время как первая переменная (двойной инициал) сохраняет свое начальное значение в коде первого примера, объект «отправитель» изменяет значение своего свойства содержимого в соответствии с новой переменной, в которую он был приведен?

1-е место:

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".
}

person ilcognito    schedule 17.05.2015    source источник
comment
Потому что int — это тип значения, а Button — это ссылочный тип. См. msdn.microsoft.com/en-us/library/t63sy5hs.aspx   -  person haim770    schedule 17.05.2015


Ответы (1)


К кастингу это отношения не имеет. В этом разница между типами значений и ссылочными типами. 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 |
                        +-------------+

Во втором примере вы просто изменяете свойство кнопки, вы не меняете объект, на который указывает переменная.

person Heinzi    schedule 17.05.2015
comment
Типы значений здесь не имеют большого значения. OP переназначает переменную; не мутируя его (в первом примере). Даже если бы это был ссылочный тип, он будет вести себя так же. - person Sriram Sakthivel; 17.05.2015
comment
@SriramSakthivel Но ОП также предполагает ссылочную семантику для типа значения. - person Yuval Itzchakov; 17.05.2015
comment
@SriramSakthivel: Спасибо за отзыв, я включил его в свой ответ (и +1 к вашему). - person Heinzi; 17.05.2015
comment
@YuvalItzchakov Я этого не вижу. Но просто этот вопрос не имеет особого смысла. - person Sriram Sakthivel; 17.05.2015