Страницы

Поиск по вопросам

суббота, 28 декабря 2019 г.

Не простые вопросы о языке C#

#c_sharp


Был на собеседовании и завалился. Теперь пытаюсь постепенно забить пробелы в знаниях
- осталось немного вопросов, которые я не могу решить сам, поэтому прошу помощи:
Есть запакованная структура, как изменить значение поля структуры, при этом не распаковывая её?
UPD1:
Вопрос на собеседовании который я тоже к сожалению завалил и не смог найти адекватного
ответа за пару дней, может кто либо из вас знает :
Есть метод в котором много строк кода (100 например), в конце выполнения метода выбивает
исключение, как сохранить те данные (ту работу которую проделал данный метод) до исключения ? 
Буду признателен если хотя бы дадите совет куда "копать" !     


Ответы

Ответ 1



Через интерфейс void Main() { var o = (I)new A(); (o).Inc(); (o).Dump(); } interface I { void Inc(); } struct A : I { public int f; public void Inc() { f++; } } выведет f = 1. Код (нету unbox): IL_0001: ldloca.s 01 // CS$0$0000 IL_0003: initobj UserQuery.A IL_0009: ldloc.1 // CS$0$0000 IL_000A: box UserQuery.A IL_000F: stloc.0 // o IL_0010: ldloc.0 // o IL_0011: callvirt UserQuery+I.Inc IL_0016: nop IL_0017: ldloc.0 // o IL_0018: call LINQPad.Extensions.Dump

Ответ 2



Поскольку по первой части вопроса о запакованной структуре уже ответили, скажу пару слов по второй части. Честно говоря, не очень понятна формулировка "как сохранить те данные (ту работу которую проделал данный метод) до исключения ?". Не слишком ясно, что понимается под "сохранить работу". Очень похоже на то, что собеседовавший вас человек дал вам изначально неправильную задачу. И дело вот в чем. Если по-хорошему, то функции/методы должны быть чистыми. То есть выполнять одну задачу, и не делать сразу несколько дел. Поэтому если метод при вызове выбрасывает исключение, то эта единственная задача не может быть выполнена. Однако в вопросе речь идет о некой "работе", результаты которой нужно "сохранить", несмотря на выброшенное исключение. То есть получается, что этот чудо-метод выполняет несколько задач, одна из которых была выполнена, а другая нет. Однако наличие таких методов, которые как Юлий Цезарь которые занимаются сразу несколькими делами - признак дурной архитектуры. А учитывая, что сама формулировка вопроса говорит о методе с сотней строк кода (для метода это много), становится очевидно, что сам метод нужно рефакторить и разбивать на несколько маленьких. А уже каждый из этих методов может что-то там делать, или кидать свои исключения, если это "что-то" сделать нельзя. Ну и пару слов по сабжу. В силу размытости формулировки вряд ли можно стопроцентно угадать, что от вас хотел собеседовавший. Очевидно, что исключение необходимо обрабатывать, поэтому код, способный его сгенерировать, следует завернуть в блок try, а в catch описать логику реакции на исключение. Возможно, что он хотел услышать от вас что-нибудь про использование секции finally (хотя ее обычно не раздувают на сотню строк) Так или иначе есть ощущение, что человек, собеседовавший вас, не гнушается говнокодством

Ответ 3



Ну, самый прямой путь — через reflection: object boxed = new KeyValuePair(0, 0); boxed.GetType() .GetField("key", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public) .SetValue(boxed, 1); Console.WriteLine(boxed); // [1, 0] ILSpy показывает, что unbox тоже не генерируется.

Комментариев нет:

Отправить комментарий