2015-05-17 2 views
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". 
} 
+4

Потому что 'int' - это тип значения, а' Button' - ссылочный тип. См. Https://msdn.microsoft.com/en-us/library/t63sy5hs.aspx – haim770

ответ

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 | 
         +-------------+ 

В вашем втором примере, вы просто модифицирования свойства кнопки, вы не меняетесь, какой объект переменных указует.

+0

Типы значений на самом деле не имеют значения. ОП переназначает переменную; не мутируя его (в первом примере). Даже если бы это был тип referencetype, он будет вести себя одинаково. –

+2

@SriramSakthivel Но OP также принимает ссылочную семантику по типу значений. –

+0

@SriramSakthivel: Спасибо за обратную связь, я включил его в свой ответ (и +1 к вашему). – Heinzi