Здравствуйте, alexzzzz, Вы писали:
A>2. Что такое Type.IsByRef ?
class Program
{
static void Main()
{
var type = typeof(Program).GetMethod("Method").GetParameters()[0].ParameterType;
Print(type);
}
static void Print(Type type)
{
Console.WriteLine($"{type.Name} is a byref-type: {type.IsByRef}");
Console.WriteLine();
}
public void Method(ref int value)
{
}
}
1. Что нужно написать вместо ???, чтобы для ссылочных типов ответ был True?
using System;
class Program
{
static void Main()
{
Print(typeof(int));
Print(typeof(int*));
Print(typeof(int[]));
}
static void Print(Type type)
{
Console.WriteLine($"{type.Name} is a value-type: {type.IsValueType}");
Console.WriteLine($"{type.Name} is a pointer-type: {type.IsPointer}");
Console.WriteLine($"{type.Name} is a reference-type: {type.???}"); // <----- ???
Console.WriteLine();
}
}
Можно конечно перебором. По спецификации, к ссылочным типам относятся массивы, делегаты, интерфейсы и классы (в том числе string, object и dynamic). Если что-то из этого, то тип ссылочный. Но вдруг в C# 12 добавят что-то ещё ссылочное.
Можно методом исключения: если не value-тип и не указатель, значит ссылочный тип. Но вдруг в C# 13 появится четвёртый, доселе неизвестный тип типов.
Справка говорит как-то расплывчато. Непонятно, что это означает:
Gets a value indicating whether the Type is passed by reference.
Remarks
To get to the actual type, dereference the type that was passed by reference, and then call GetElementType on that type.
Там даже есть пример кода, из которого вроде кажется, что IsByRef как раз должен возвращать true для ссылочных типов. Но он так не работает: для массивов и для классов возвращает false.
Здравствуйте, alexzzzz, Вы писали:
A>Вопрос праздный, возник случайно.
кошмар какой
A>Можно методом исключения: если не value-тип и не указатель, значит ссылочный тип. Но вдруг в C# 13 появится четвёртый, доселе неизвестный тип типов.
Посылочный. Но, вам его не отдадут т.к credentials нету — такие типы можно смело игнорировать.
A>2. Что такое Type.IsByRef ?
A>Справка говорит как-то расплывчато. Непонятно, что это означает: A>
Gets a value indicating whether the Type is passed by reference.
A>Там даже есть пример кода, из которого вроде кажется, что IsByRef как раз должен возвращать true для ссылочных типов. Но он так не работает: для массивов и для классов возвращает false.
Справка описывает ситуацию буквально. Очевидно, что переменные типа Array, object, int и т.п. в обычных сценариях передаются по значению (если конечно понимать, что на самом деле хранится в переменной).
Потому и получается, что не смотря на то, что оно как-бы класс, но IsByRef там false
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, alexzzzz, Вы писали:
A>Можно методом исключения: если не value-тип и не указатель, значит ссылочный тип.
Да, это наиболее надёжный способ. Спецификация CLR описывает ровно три вида типов: ссылочные, значения, и указатели. A>Но вдруг в C# 13 появится четвёртый, доселе неизвестный тип типов.
Тогда вашу программу придётся переписать.
Но лучше задаться вопросом "а зачем мне это надо?". Скорее всего, окажется, что для решения настоящей задачи не потребуется никакого IsReferenceType(Type type).
Например, для забоксенного инта GetType().IsValueType выдаёт true, а на самом деле значение ссылочное.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
A>>Можно методом исключения: если не value-тип и не указатель, значит ссылочный тип. S>Да, это наиболее надёжный способ. Спецификация CLR описывает ровно три вида типов: ссылочные, значения, и указатели.
В ECMA-335 минимум в одном месте pointer types и function pointer types перечислены через запятую.
Здравствуйте, alexzzzz, Вы писали: A>В ECMA-335 минимум в одном месте pointer types и function pointer types перечислены через запятую.
Ну, мест может быть много. Вот то, которое нас интересует:
There are two kinds of types: value types and reference types.
Value types – The values described by a value type are self-contained (each can be understood without reference to other values).
Reference types –A value described by a reference type denotes the location of another value. There are four kinds of reference type: An object type is a reference type of a self-describing value (see §I.8.2.3). Some object types (e.g., abstract classes) are only a partial description of a value.
An interface type is always a partial description of a value, potentially supported by many object types.
A pointer type is a compile-time description of a value whose representation is a machine address of a location. Pointers are divided into managed (§I.8.2.1.1, §I.12.1.1.2) and unmanaged (§I.8.9.2).
Built-in reference types.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
В общем, из всего следует вывод, что у CLI, C# и System.Reflection — у каждого собственная отличающаяся точка зрения на классификацию типов. Ждать строгости и логичности не стоит.