Передача struct по ссылке box/unbox

284
09 сентября 2018, 03:10

разбираюсь с box/unbox, просматриваю свой код на наличие операторов box через ildasm.exe

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

class Program
{
    static ManagerMyClass ManagerMyClass = new ManagerMyClass();
    static void Main(string[] args)
    {            
        //first example
        MyClass myClassLink = null;
        ManagerMyClass.GetClassLink(ref myClassLink);
        var myStruct = new MyStruct(myClassLink.A);
        //second example
        var myStruct2 = new MyStruct();
        ManagerMyClass.GetMyStruct(ref myStruct2);
    }        
}
struct MyStruct
{
    internal readonly uint A;
    internal MyStruct(uint A)
    {
        this.A = A;
    }
}
class MyClass
{
    internal readonly uint A;
    internal MyClass(uint A)
    {
        this.A = A;
    }
}
class ManagerMyClass
{
    readonly MyClass MyClass = null;
    internal ManagerMyClass()
    {
        this.MyClass = new MyClass(1);
    }
    internal void GetClassLink(ref MyClass MyClass)
    {
        MyClass = this.MyClass;
    }
    internal void GetMyStruct(ref MyStruct MyStruct)
    {
        MyStruct = new MyStruct(this.MyClass.A);
    }
}

Верно ли, что при использовании метода ManagerMyClass.GetMyStruct() происходит невидимая упаковка переменной myStruct2 и последующая распаковка? Или это работает иначе?

Answer 1

Упаковка не производится, просто значение передается по ссылке.

Не следует путать понятие передачи по ссылке с понятием ссылочных типов. Эти два понятия не совпадают. Параметр метода может быть изменен с помощью ref независимо от того, принадлежит ли он к типу значения или ссылочному типу. При передаче по ссылке упаковка-преобразование типа значения не производится.

https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/ref

READ ALSO
Как можно растянуть вложенные элементы ToolBar?

Как можно растянуть вложенные элементы ToolBar?

Как можно растянуть вложенные в ToolBar элементы на всю ширину ToolBar? Чтобы можно было через margin задавать расположение кнопок относительно правого...

292
Оператор switch вложенный в другой. Как сократить?

Оператор switch вложенный в другой. Как сократить?

Суть такова - есть динамическое кол-во игроков которое определяется юзеромНам нужно сделать что бы при вызове метода менялся цвет игрока...

307
c# получение dom в winform

c# получение dom в winform

Хотел бы узнать есть ли какой либо другой элемент работы с DOM на с# кроме WebBrowserПричина следующая: WebBrowser использует движок IE и давально старый,...

321