Хорошо, давайте использовать трюк ...
Что мы знаем?
- Переменная типа значения упаковывается снова и снова при назначении переменной типа ссылки
- Переменная ссылочного типа не будет упакована снова ...
Итак, мы просто проверим, упакован ли он снова (в другой объект) ... поэтому мы сравним ссылки
isReferenceType
будет false здесь, потому что мы сравниваем 2 объекта в куче (один упакован в surelyBoxed
, один упакован только в вызове ReferenceEquals):
int checkedVariable = 123; //any type of variable can be used here
object surelyBoxed = checkedVariable;
bool isReferenceType = object.ReferenceEquals(surelyBoxed, checkedVariable);
isReferenceType
будет true здесь, потому что мы сравниваем 1 объект в куче с собой:
object checkedVariable = 123; //any type of variable can be used here
object surelyBoxed = checkedVariable;
bool isReferenceType = object.ReferenceEquals(surelyBoxed, checkedVariable);
Это работает для ЛЮБОГО типа, а не только для int
и object
Чтобы поместить его в удобный метод:
public static bool IsReferenceType<T>(T input)
{
object surelyBoxed = input;
return object.ReferenceEquals(surelyBoxed, input);
}
Этот метод можно легко использовать следующим образом:
int i1 = 123;
object o1 = 123;
//...
bool i1Referential = IsReferenceType(i1); //returns false
bool o1Referential = IsReferenceType(o1); //returns true