Звичайні типи, що містять посилальні типи в Visual C # (Sharp)

Правило, що при присвоєнні змінних звичайного типу іншим перемеим, значення копіюються, не поширюється на ситуацію, коли звичайний тип

містить в якості члена даних контрольний тип Візьмемо, наприклад, слідуючи оголошення:

struct MyValueTypeWithReferenceType { public int value

public MyReferenceType reference

}

У ЦЬОМУ коді оголошується звичайний тип MyValueTypeWithReferenceType, який містить один член даних звичайного типу (int) і один член даних посилального типу (MyReferenceType) Це оголошення неявно вказує, що звичайний тип сраняется в стеку, а контрольний тип – в купі

Звичайним типом, що містить контрольний тип, можна маніпулювати за допомогою наступного коду:

MyValueTypeWithReferenceType var = new MyValueTypeWithReferenceType() varreference = new MyReferenceType()

MyValueTypeWithReferenceType copiedVar = var

ConsoleWriteLine(&quotvar value=&quot + varreferencevalue +

&quot&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp copiedVar value=&quot + copiedVarreferencevalue) varreferencevalue = 10

ConsoleWriteLine(&quotvar value=&quot + varreferencevalue +

&quot&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp copiedVar value=&quot + copiedVarreferencevalue

Важливо розуміти, що призначення MyValueTypeWithReferenceType не означає нначеніе впровадженого користувальницького типу У тестовому коді змінна типу MyValueTypeWithReferenceType призначається таким же чином, як і в попе прикладах, але змінну типу MyReferenceType потрібно призначати знову, Т К ти п MyReferenceType являетс я посилальними Есл і б ти п MyReferenceType був звичайним, то друге призначення не було б необхідним Але якщо виділити звичайний тип подібно посилальному типу, то компілятор проігнорує цю дектіву

Результати виконання попереднього коду будуть наступними:

var value=0  copiedVar value=0 var value=10 copiedVar value=10

Коли виділяється і модифікується впроваджений контрольний тип, то екземпляр посилального типу модифікується для обох змінних У даному випадку при присвоєнні звичайного типу було скопійовано вміст, включаючи покажчик на контрольний тип

Поведінка типів при присвоєнні виділеної змінної іншої змінної з подальшою модифікацією елемента даних в первісної змінної викладено в табл 41 Наприклад, якщо виконати код custom2 = customi customi member = [нове значення], яким буде значення члена custom2 member

Таблиця 41Поведінка типів при присвоєнні виділеної змінної іншої змінної з подальшою модифікацією елемента даних в первісної змінної

Ти п

Поведінка

Звичайний тип

Присвоєний елемент даних не модифікується

Контрольний тип

Присвоєний елемент даних модифікується

Звичайний тип з впровадженим обиим типом

Присвоєний впроваджений елемент даних не міфіціруется

Звичайний тип з впровадженим ссочним типом

Присвоєний впроваджений елемент даних модіфіруется

Контрольний тип з впровадженим звичайним типом

Присвоєний впроваджений елемент даних модіфіруется

Контрольний тип з впровадженим ссочним типом

Присвоєний впроваджений елемент даних модіфіруется

Джерело: Гросс К С # 2008: Пер з англ – СПб: БХВ-Петербург, 2009 – 576 е: ил – (Самовчитель)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*