[R#3.11] Introduce variable и присвоение свойств
От: Блудов Павел Россия  
Дата: 19.02.08 01:06
Оценка:
Вот в таком незамысловатом коде
private void HandleRetrieveVirtualItem2(object sender, RetrieveVirtualItemEventArgs e)
{
    e.Item = new ListViewItem("foo");
    e.Item.Tag = "bar";
}

Если на выделенном сделать Introduce variable и заменить все его два вхождения получим
private void HandleRetrieveVirtualItem2(object sender, RetrieveVirtualItemEventArgs e)
{
    ListViewItem item = e.Item;
    e.Item = new ListViewItem("foo");
    item.Tag = "bar";
}

Что без вариантов приведёт нас к NullReferenceException.
Пожалуйста, учитывайте, что если в target для Introduce variable что-то положили, то это уже совсем другой объект.
... << RSDN@Home 1.2.0 alpha rev. 788>>
Re: [R#3.11] Introduce variable и присвоение свойств
От: Serjic  
Дата: 23.02.08 19:22
Оценка:
Introduce variable для левой части присваивания можно рассматривать исключительно как контекстный экшен, который только заводит новую переменную и присваивает ей значение. К сожалению, ничего более вразумительного придумать не получается.

PS Introduce variable во многих случаях ломает семантику, но такова его природа)
Re[2]: [R#3.11] Introduce variable и присвоение свойств
От: Блудов Павел Россия  
Дата: 25.02.08 04:17
Оценка:
Здравствуйте, Serjic, Вы писали:

S>Introduce variable для левой части присваивания можно рассматривать исключительно как контекстный экшен, который только заводит новую переменную и присваивает ей значение. К сожалению, ничего более вразумительного придумать не получается.

Почему не получается? Я же пишу русскими буквами: после того как в левую часть что-то положили, нужно либо заново инициализировать переменную (что будет выглядеть ужасно но работать правильно) либо просто останавливаться. Т.е. контекст для Introduce variable должен быть от забора и до того места, как поменяется левая часть.
... << RSDN@Home 1.2.0 alpha rev. 788>>
Re[3]: [R#3.11] Introduce variable и присвоение свойств
От: Serjic  
Дата: 25.02.08 08:58
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

БП>Почему не получается? Я же пишу русскими буквами: после того как в левую часть что-то положили, нужно либо заново инициализировать переменную (что будет выглядеть ужасно но работать правильно) либо просто останавливаться. Т.е. контекст для Introduce variable должен быть от забора и до того места, как поменяется левая часть.


Вариант заново инициализировать переменную будет работать, но такое поведение вряд ли кто-то ожидает. Самым правильным, скорее всего, будет не искать других вхождений в случае получателя присваивания (усеченный вариант 2). Полноценный вариант 2 опять же будет трудно предсказуем, особенно в случае сложного потока управления.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.