отличие boxing-unboxing от ref
От: A-Myth  
Дата: 24.10.05 06:41
Оценка:
Добрый день,
Наколько я понимаю, в .NET, упаковка — это приведение структурного типа к ссылочному.
С помощью модификатора ref происходит передача параметров по ссылке.
В чем их принципиальное отличие? И, главное, укажите, пожалуйста, примеры кода/ситуаций, когда нужно использовать boxing-unboxing, а когда ref (out).
Спасибо.
отличие boxing-unboxing от ref
От: Аноним  
Дата: 24.10.05 06:54
Оценка:
При передаче параметра размерного типа по ссылке, происходит boxing.
Поэтому я считаю не стоит передавать параметры размерного типа по ссылке, ведь потом внутри функции, использующей эту переменную будет происходить unboxing, а потом опять boxing...
SUNETA


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: отличие boxing-unboxing от ref
От: TK Лес кывт.рф
Дата: 24.10.05 06:57
Оценка:
Hello, "A-Myth"

> Наколько я понимаю, в .NET, упаковка — это приведение структурного типа к

> ссылочному.
> С помощью модификатора ref происходит передача параметров по ссылке.
> В чем их принципиальное отличие? И, главное, укажите, пожалуйста, примеры
> кода/ситуаций, когда нужно использовать boxing-unboxing, а когда ref
> (out).
>


ref (out) используется в случаях когда в вызываемом коде надо модифицировать
передаваемую переменую
boxing/unboxing используется в случаях когда value типа надо передать как
object

Кардинальное отличие в том, что ref (out) оперируют с переменными (полями
объектов и т.п) а boxing/unboxing оперирует со значениями этих переменных...
Posted via RSDN NNTP Server 2.0 beta
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: отличие boxing-unboxing от ref
От: TK Лес кывт.рф
Дата: 24.10.05 07:01
Оценка:
Hello, "k_savelev"
> При передаче параметра размерного типа по ссылке, происходит boxing.

Скорее при конвертации размерного типа в ссылочный.

> Поэтому я считаю не стоит передавать параметры размерного типа по ссылке,

> ведь потом внутри функции, использующей эту переменную будет происходить
> unboxing, а потом опять boxing...
>

при использовании ref (out) никакого боксинга не происходит. просто
передается указатель на нужное значение.
Posted via RSDN NNTP Server 2.0 beta
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: отличие boxing-unboxing от ref
От: Andrbig  
Дата: 24.10.05 07:31
Оценка: 2 (1)
Здравствуйте, A-Myth, Вы писали:

AM>Добрый день,

AM>Наколько я понимаю, в .NET, упаковка — это приведение структурного типа к ссылочному.

Нет. Object может хранить в себе любой тип, в т.ч. и структурный (как — это его забота). Вот помещение стуктурного типа в object и есть упаковка (boxing).

AM>С помощью модификатора ref происходит передача параметров по ссылке.

AM>В чем их принципиальное отличие? И, главное, укажите, пожалуйста, примеры кода/ситуаций, когда нужно использовать boxing-unboxing, а когда ref (out).

если надо передавать параметр разных типов, то object
если надо получать значение разных типов, то ref object
если надо передавать параметры одного типа, то этот тип
если надо получать значение конкретного типа, то ref этот тип

Boxing Conversion, из спецификации
Re: отличие boxing-unboxing от ref
От: Аноним  
Дата: 24.10.05 07:33
Оценка:
2 TK
Действительно, Вы правы

Прошу прощения за то, что пытался морочить голову

Вот тест:

class Program
{
static void Main( string[] args )
{
int a = 10;
Func( a );
Func( ref a );
}
static void Func( ref int a )
{
Console.Write( a );
}
static void Func( object a )
{
Console.Write( a );
}
}

А вот IL для функции Main:
IL_0000: nop
IL_0001: ldc.i4.s 10
IL_0003: stloc.0
IL_0004: ldloc.0
// Здесь есть
IL_0005: box [mscorlib]System.Int32
IL_000a: call void ConsoleApplication1.Program::Func(object)
IL_000f: nop
IL_0010: ldloca.s a
// Здесь нет
IL_0012: call void ConsoleApplication1.Program::Func(int32&)
IL_0017: nop
IL_0018: ret

Ещё раз извиняюсь
SUNETA


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: отличие boxing-unboxing от ref
От: VladGalkin Украина  
Дата: 08.12.05 09:50
Оценка:
Здравствуйте, A-Myth, Вы писали:
AM>Наколько я понимаю, в .NET, упаковка — это приведение структурного типа к ссылочному.
AM>С помощью модификатора ref происходит передача параметров по ссылке.
AM>В чем их принципиальное отличие? И, главное, укажите, пожалуйста, примеры кода/ситуаций, когда нужно использовать boxing-unboxing, а когда ref (out).
Cейчас разрулим с помощью цитаты из книги Сержа Лидина (одного из авторов IL) "Inside Microsoft .NET IL Assembler":

Managed pointers are different from object references. In Chapter 6, “Namespaces and Classes,” which described boxing and unboxing of the value types, we saw that it takes boxing to create an object reference to a value type. Using a simple reference—that is, a managed pointer—is not enough.

The difference is that an object reference points to the method table of an object, whereas a managed pointer points to the value (data) part of the item. When you take a managed pointer to an instance of a value type, you address the data part. You can have only this much because instances of value types, not being objects, have no method tables.

When you box a value type instance, you create an object, a class instance with its own method table and data part copied from the value type instance. This object is represented by an object reference.

... << RSDN@Home 1.1.4 stable rev. 510>>
ДЭ!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.