gettype — получает тип переменной.


Содержание

gettype

gettype — Возвращает тип переменной

Описание

Возвращает тип PHP-переменной var.

Не используйте gettype() для проверки определенного типа, так как возвращаемая строка может измениться в следующих версиях. Вдобавок, эта функция довольно медленная, поскольку она вызывает сравнение строк.

Используйте функции is_* вместо нее.

Список параметров

Переменная, тип которой проверяется.

Возвращаемые значения

Возможными значениями возвращаемой строки являются:

  • » boolean «
  • » integer «
  • » double » (по историческим причинам «double» возвращается в случае типа float , а не просто «float»)
  • » string «
  • » array «
  • » object «
  • » resource «
  • » NULL «
  • «unknown type»

Смотрите также

  • settype() — Присваивает переменной новый тип
  • is_array() — Определяет, является ли переменная массивом
  • is_bool() — Проверяет, является ли переменная булевой
  • is_float() — Проверяет, является ли переменная числом с плавающей точкой
  • is_int() — Проверяет, является ли переменная целого типа
  • is_null() — Проверяет, является ли значение переменной равным NULL
  • is_numeric() — Проверяет, является ли переменная числом или числовой строкой
  • is_object() — Проверяет, является ли переменная объектом
  • is_resource() — Проверяет, является ли переменная ресурсом
  • is_scalar() — Проверяет, является ли переменная скалярным значением
  • is_string() — Проверяет, является ли переменная строкой
  • function_exists() — Возвращает TRUE, если данная функция определена
  • method_exists() — Проверяет, существует ли метод в данном классе

gettype

(PHP 4, PHP 5, PHP 7)

gettype — Возвращает тип переменной

Описание

Возвращает тип PHP-переменной var . Для проверки типа переменной используйте функции is_*.

Список параметров

Возвращаемые значения

Возможными значениями возвращаемой строки являются:

  • » boolean «
  • » integer «
  • » double » (по историческим причинам в случае типа float возвращается «double», а не просто «float»)
  • » string «
  • » array «
  • » object «
  • » resource «
  • «resource (closed)» с PHP 7.2.0
  • » NULL «
  • «unknown type»

Примеры

Пример #1 Пример использования gettype()

= array( 1 , 1. , NULL , new stdClass , ‘foo’ );

foreach ( $data as $value ) <
echo gettype ( $value ), «\n» ;
>

Результатом выполнения данного примера будет что-то подобное:

Список изменений

Версия Описание
7.2.0 Для закрытых ресурсов теперь возвращается ‘resource (closed)’. Ранее для закрытых ресурсов возвращалось ‘unknown type’.

Смотрите также

  • settype() — Присваивает переменной новый тип
  • get_class() — Возвращает имя класса, к которому принадлежит объект
  • is_array() — Определяет, является ли переменная массивом
  • is_bool() — Проверяет, является ли переменная булевой
  • is_callable() — Проверяет, может ли значение переменной быть вызвано в качестве функции
  • is_float() — Проверяет, является ли переменная числом с плавающей точкой
  • is_int() — Проверяет, является ли переменная целым числом
  • is_null() — Проверяет, является ли значение переменной равным NULL
  • is_numeric() — Проверяет, является ли переменная числом или строкой, содержащей число
  • is_object() — Проверяет, является ли переменная объектом
  • is_resource() — Проверяет, является ли переменная ресурсом
  • is_scalar() — Проверяет, является ли переменная скалярным значением
  • is_string() — Проверяет, является ли переменная строкой
  • function_exists() — Возвращает TRUE, если указанная функция определена
  • method_exists() — Проверяет, существует ли метод в данном классе

Gettype — получает тип переменной.


gettype
Получает тип переменной.

Синтаксис :
string gettype(mixed var);
Возвращает тип переменной PHP var.
Возможные значения для возвращаемой строки:
«integer»
«double»
«string»
«array»
«object»
«unknown type»

intval
Возвращает целочисленное значение переменной.

Синтаксис :
int intval(mixed var, int [base]);

Возвращает целочисленное значение переменной var, используя указанное основание для перевода (по умолчанию 10). var может быть скалярного типа. Вы не можете использовать функцию intval() для массивов или объектов.

doubleval
Получает значение переменной в формате double.

Синтаксис :
double doubleval(mixed var);

Возвращает double (с плавающей точкой) значение переменной var.
var может быть скалярного типа. Вы не можете использовать doubleval() на массивах и объектах.

empty
Определяет, есть ли у переменной какое либо значение.

Синтаксис :
int empty(mixed var);

Возвращает false, если var существует и имеет не пустое или не нулевое значение; true в обратном случае.
Фактически функция проверяет, имеет ли переменнная значение, которое может быть приравнено к 0, то есть: (var==0) Заметьте, что эту функцию бесполезно использовать с аргументом, отличным от переменной, например выражение empty (Addslashes($name)) бессмысленно, т.к. здесь проверяется значение, возвращаемое функцией. Единственное, что может выявить в данном варианте функция empty() , это имеет ли выражение значение, эквивалентное true (не равное нулю), а это может быть проверено и без использования функции.

isset
Определяет, существует ли переменная.

Синтаксис :
int isset(mixed var);

Возвращает true, если var существует; false в обратном случае.
Фактически функция проверяет, имеет ли переменная значение, идентичное null, то есть: (var===null). Отметьте различие между равенством и идентичностью.
Если переменная была удалена функцией unset(), она больше не будет определяться функцией isset().

settype
Устанавливает тип переменной.

Синтаксис :
int settype(string var, string type);

Устанавливает тип переменнойvar на type.
Возможные значения type :
«integer»
«double»»
«string»
«array»»
«object»
Возвращает true, при успехе; false в обратном случае.

strval
Получает строковое значение переменной.

Синтаксис :
string strval(mixed var);

Получает строковое значение var.
var может быть любого скалярного типа. Вы не можете использовать strval() на массивах или объектах.

unset
Удаляет указанную переменную.

Синтаксис :
int unset(mixed var);

unset() уничтожает указанную переменную и возвращает true.
Пример :
unset( $foo );
unset( $bar[«quux»] );

Когда и где использовать GetType() или typeof()?

Почему это работает

Но это работает

Я сам использую оператор is для проверки типа, но мое понимание терпит неудачу, когда я использую typeof() и GetType()

Где и когда использовать GetType() или typeof() ?

typeof является оператором для получения типа, известного во время компиляции (или, по крайней мере, для параметра общего типа). Операндом typeof всегда является имя параметра типа или типа — никогда не выражение со значением (например, переменной). Подробнее см. спецификацию языка С#.

GetType() — это метод, который вы вызываете для отдельных объектов, чтобы получить тип времени выполнения объекта.

Обратите внимание, что, если вам нужны только те экземпляры TextBox (а не экземпляры подклассов), вы обычно используете:

typeof применяется к типу, который известен во время компиляции. Он также может применяться к параметрам общего типа. GetType применяется к объекту во время выполнения. В обоих случаях результатом является объект типа System.Type , содержащий метаинформацию о типе.

Эти две строки действительны


И это сравнение дает true

Эти две строки действительны

И это сравнение дает false

i., тип времени компиляции (статический тип) переменной obj не совпадает с типом среды выполнения (динамический тип) объекта, на который ссылается obj . (Здесь «динамический» не имеет ничего общего с ключевым словом dynamic !)

Если, однако, вы хотите знать, является ли mycontrol TextBox , тогда вы можете просто протестировать

Обратите внимание, что это не полностью эквивалентно

поскольку mycontrol может иметь тип, полученный из TextBox . В этом случае первое сравнение дает true , а второе false ! В большинстве случаев первый и более простой вариант в порядке, так как элемент управления, полученный из TextBox , наследует все, что TextBox имеет, вероятно, добавляет к нему больше, и поэтому присваивание совместимо с TextBox .

Если у вас есть следующий тест, за которым следует бросок, а T — значение nullable.

. вы можете изменить его на.

Тестирование того, является ли значение данного типа и литье (которое включает этот же тест снова), может занять много времени для длинных цепочек наследования. Использование оператора as , за которым следует тест для null , более эффективно.

Начиная с С# 7.0, вы можете упростить код, используя сопоставление с образцом:

Как проверить тип переменной (PHP)

Вступление

В PHP для определения типа переменной существует функция string gettype(mixed var) , которая возвращает название типа переменной в виде строки: null, boolean, integer, string, double, array, object, resource.

Пример

Определим по одной переменной каждого вида, и установим соответствующее переменной значение, а затем выведем результат проверки каждой переменной на экран.

Результат

NULL
boolean
integer
double
string
array
resource
object

Как видно из результата, функция gettype() отлично справляется с поставленной задачей.

Примечание

Если тип переменной float , то результат функции будет double .

Проверка типа: typeof, GetType или есть?

Я видел, как многие люди используют следующий код:

Но я знаю, что вы тоже можете это сделать:

Лично я чувствую, что последнее самое чистое, но есть ли что-то, что мне не хватает? Какой из них лучше всего использовать, или это личные предпочтения?

14 ответов

  • typeof принимает имя типа (которое вы указываете во время компиляции).
  • GetType получает тип экземпляра экземпляра.
  • is возвращает true, если экземпляр находится в дереве наследования.

Пример

Как насчет typeof(T) ? Это также разрешено во время компиляции?

Да. T всегда является типом выражения. Помните, что общий метод — это в основном целая куча методов с соответствующим типом. Пример:

Используйте typeof , когда вы хотите получить тип во время компиляции. Используйте GetType , когда вы хотите получить тип во время выполнения. Редко случаются случаи использования is , так как он выполняет бросок, и в большинстве случаев вы в конечном итоге литье переменной.

Существует четвертый вариант, который вы не учли (особенно если вы собираетесь применить объект к тому типу, который вы найдете); то есть использовать as .


Это использует только один, тогда как этот подход:

требуется два.

1.

Это незаконно, потому что typeof работает только с типами, а не с переменными. Я предполагаю, что obj1 является переменной. Таким образом, typeof статичен и выполняет свою работу во время компиляции, а не во время выполнения.

2.

Это верно, если obj1 — это точно тип int. Если obj1 выводится из int, условие if будет ложным.

3.

Это верно, если obj1 является int, или если он получен из класса с именем int, или если он реализует интерфейс с именем int.

Это ошибка. Оператор typeof в С# может принимать только имена типов, а не объекты.

Это будет работать, но, возможно, не так, как вы ожидали. Для типов значений, как вы показали здесь, это приемлемо, но для ссылочных типов оно возвращает только true, если тип был тем же самым типом, а не что-то еще в иерархии наследования. Например:

Это напечатает «o is something else» , потому что тип o равен Dog , а не Animal . Вы можете сделать эту работу, однако, если вы используете метод IsAssignableFrom класса Type .

Однако этот метод все еще оставляет серьезную проблему. Если ваша переменная равна нулю, вызов GetType() вызовет исключение NullReferenceException. Чтобы сделать работу правильно, выполните следующие действия:

При этом у вас есть эквивалентное поведение ключевого слова is . Следовательно, если это поведение, которое вы хотите, вы должны использовать ключевое слово is , которое является более читаемым и более эффективным.

В большинстве случаев ключевое слово is все еще не то, что вы действительно хотите, потому что обычно этого недостаточно, чтобы знать, что объект имеет определенный тип. Обычно вы хотите использовать этот объект как экземпляр этого типа, который требует также его литья. И поэтому вы можете написать код такого типа:

Но это делает CLR проверкой типа объекта до двух раз. Он проверит его один раз, чтобы удовлетворить оператор is , и если o действительно является Animal , мы заставляем его снова проверять подтверждение акта.

Более эффективно это сделать:

Оператор as — это приведение, которое не генерирует исключение, если оно терпит неудачу, вместо этого возвращается null . Таким образом, CLR проверяет тип объекта только один раз, и после этого нам просто нужно выполнить нулевую проверку, что более эффективно.

Но будьте осторожны: многие люди попадают в ловушку с as . Поскольку это не вызывает исключений, некоторые люди считают его «безопасным» броском, и они используют его исключительно, избегая регулярных бросков. Это приводит к следующим ошибкам:

В этом случае разработчик явно предполагает, что o всегда будет Animal , и пока их предположение верно, все работает нормально. Но если они ошибаются, то, что в итоге получается, это NullReferenceException . При регулярном приведении они вместо этого получили бы InvalidCastException , что позволило бы более точно идентифицировать проблему.

Иногда эта ошибка может быть трудно найти:

Это еще один случай, когда разработчик явно ожидает, что o будет Animal каждый раз, но это не очевидно в конструкторе, в котором используется приведение as . Это не очевидно, пока вы не перейдете к методу Interact , где ожидается, что поле Animal будет положительно назначено. В этом случае вы не только получаете ошибочное исключение, но и не генерируете его до тех пор, пока оно не будет намного позже, чем когда произошла фактическая ошибка.

Если вам нужно только знать, имеет ли объект какой-либо тип, используйте is .

Если вам нужно рассматривать объект как экземпляр определенного типа, но вы точно не знаете, что объект будет такого типа, используйте as и проверьте null .

Если вам нужно рассматривать объект как экземпляр определенного типа, и объект должен быть такого типа, используйте обычный листинг.

Как я могу получить тип данных переменной в C#?

Как я могу узнать, какой тип данных содержит некоторая переменная? (например, int, string, char и т. д.)

У меня есть что-то вроде этого сейчас:

10 ответов:

другие ответы предлагают хорошую помощь в этом вопросе, но есть важный и тонкий вопрос, который ни один из них не обращается непосредственно. Существует два способа рассмотрения типа В C#:статического типа и тип.

статический тип-это тип переменной в исходном коде. Поэтому это концепция времени компиляции. Этот тип отображается во всплывающей подсказке при наведении указателя мыши на переменную или свойство в процессе разработки окружающая среда.

тип времени выполнения-это тип объекта в памяти. Поэтому это концепция времени выполнения. Это тип, возвращаемый GetType() метод.

тип времени выполнения объекта часто отличается от статического типа переменной, свойства или метода, который содержит или возвращает его. Например, вы можете иметь такой код:

статический тип переменной object , но во время выполнения, тип переменной референт и string . Поэтому в следующей строке системы печати «.Строка » к консоли:


но, если вы наведете курсор на переменную o в вашей среде разработки, вы увидите типа System.Object (эквивалент object ключевое слово).

для переменных типа значения, таких как int , double , System.Guid , вы знаете, что тип времени выполнения всегда будет таким же, как и статический тип, потому что типы значений не могут служить базовым классом для другой тип; тип значения гарантированно является наиболее производным типом в цепочке наследования. Это также верно для запечатанных ссылочных типов: если статический тип является запечатанным ссылочным типом, значение времени выполнения должно быть либо экземпляром этого типа, либо null .

и наоборот, если статический тип переменной является абстрактным типом, то гарантируется, что статический тип и тип среды выполнения будут отличаться.

чтобы проиллюстрировать, что в код:

вообще говоря, вам вряд ли когда-нибудь понадобится делать сравнения типов, если вы не делаете что-то с отражением или интерфейсами. Тем не менее:

если вы знаете тип, с которым вы хотите сравнить его, используйте is или as операторы:

The as оператор выполняет приведение, которое возвращает null, если оно не выполняется, а не исключение:

если вы не знаете тип и просто хотите получить информацию о типе среды выполнения, используйте .метод GetType() метод:

в новых версиях C#, вы можете использовать is оператор для объявления переменной без необходимости использовать as :

BestProg

Рефлексия. Примеры получения информации о методах, интерфейсах, классах, структурах, перечислениях, делегатах, полях типов, параметрах методов, статистических данных о типах

Содержание

1. Что собой представляет метод System.Type.GetType() ?

Метод System.Type.GetType() предназначен для получения экземпляра типа, который задан параметром. Параметр метода есть тип string . Параметр указывает название типа, для которого нужно получить информацию. В общем случае, метод System.Type.GetType() имеет 7 перегруженных реализаций.

Чтобы получить перечень методов некоторого типа (например, класса) нужно сначала получить объект, содержащий информацию о типе. Это делается с помощью метода

  • NameSpace – название пространства имен, в котором размещается тип с именем TypeName , требующий исследования;
  • TypeName – название типа, о котором нужно получить информацию. Типом может быть класс, структура, интерфейс, перечисление, делегат.

В этом примере нужно создается экземпляр (объект) с именем tp , содержащий информацию о типе с именем Date , который объявлен в пространстве имен Dates .

2. Что такое рефлексия методов? Как получить информацию о методах? Пример рефлексии методов

Рефлексия методов позволяет получить информацию о перечне общедоступных ( public ) методов из заданного типа. Информацию о методах можно получать для класса, структуры или интерфейса. Только эти типы могут содержать объявления методов.
Чтобы получить перечень методов заданного экземпляра типа, нужно вызвать метод GetMethods() , возвращающий массив типа MethodInfo , который содержит всю необходимую информацию о методах.

Пример. Задан класс Date , который описывает дату. В классе реализованы 3 внутренние переменные и 6 методов доступа к ним. Ниже приведен текст программы, которая демонстрирует рефлексию методов. Программа создана по шаблону Console Application .

В результате выполнения данного кода, на экран будет выведен перечень названий методов, которые доступны для любого объекта класса Date :

Следует отметить следующее:

  • информацию можно получить только о тех методах, которые объявленны как общедоступные с модификатором доступа public ;
  • чтобы получить экземпляр типа методом GetType() из статической функции Main() , обязательно нужно перед именем класса указывать название пространства имен в котором этот класс реализован.

3. Как получить информацию о полях класса, структуры или перечисления? Примеры рефлексии полей и свойств

Чтобы получить информацию о поле (свойстве) некоторого типа (класс, структура, перечисление), нужно использовать метод Type.GetFields() . Этот метод возвращает массив типа FieldInfo . Тип FieldInfo содержит всю необходимую информацию о полях и свойствах, которые объявлены как public .

Пример 1. Получение информации о полях структуры. Задана структура Worker . В структуре реализованы 3 поля с именами name , age , rank . В примере демонстрируется вывод информации о названии поля и его типе (свойство FieldType ). Пример реализован как консольное приложение

В результате, на экран будет выведен следующий текст:

Таким же образом можно получить информацию о полях любого класса любой сборки. Достаточно знать только имя класса в сборке.

Пример 2. Получение информации о полях перечисления. Задано перечисление Month , реализующее сокращенные названия месяцев года. Ниже приведен пример получения информации о перечислении на основе информации о его имени.


В результате, на экран будет выведен следующий текст

4. Как получить информацию об интерфейсах, которые реализует класс? Пример рефлексии интерфейсов

Чтобы получить перечень имен интерфейсов, которые поддерживаются заданным типом, используется метод GetInterfaces() . Этот метод возвращает массив интерфейсов типа Type[] .
Название интерфейса помещается в свойстве Name .

Пример. Пусть задан интерфейс IDate , в котором объявляются имена двух методов: GetNumber() , SetNumber() . Также объявляется класс Date , реализующий дату. Класс Date наследует интерфейс IDate . В примере продемонстрировано:

  • получение списка интерфейсов класса Date ;
  • получение списка методов интерфейса IDate .

Полный листинг программы, которая демонстрирует данный пример

В результате выполнения программы на экран будет выведено:

5. Пример использования рефлексии для получения дополнительных сведений о типе (классе, структуре, перечислении)

С помощью рефлексии можно получать дополнительные сведения о типе. Типом может быть класс, структура, интерфейс, перечисление, делегат.

Пример. Пусть заданы два класса:

  • класс Point , который реализует точку на координатной плоскости;
  • класс Pixel , который реализует точку заданного цвета. Класс Pixel унаследован от класса Point .

Ниже приводится полный текст программы, которая выводит дополнительные сведения о классах Point и Pixel . Программа реализована как приложение типа Console Application .

В результате выполнения программы, на экран будет выведено следующее:

6. Как получить информацию о свойствах (properties) класса? Пример

Чтобы получить информацию о свойствах класса нужно вызвать метод GetProperties() . Этот метод возвращает массив типа PropertyInfo[] . Массив PropertyInfo[] содержит сведения о свойствах (properties) класса.

Пример. Продемонстрировано получение перечня свойств для класса Student из пространства имен TrainReflection . Свойства обязательно должны быть объявлены с модификатором доступа public .

На экран будет выведен следующий текст

7. Пример использования рефлексии для получения информации о параметрах метода

Для конкретного метода можно получить информацию о его параметрах.

Проверка типа: typeof, GetType или is?

Я видел, как многие люди используют следующий код:

но я знаю, что вы также можете сделать это:

лично я чувствую, что последний самый чистый, но есть ли что-то, чего мне не хватает? Какой из них лучше всего использовать, или это личное предпочтение?

14 ответов

  • typeof принимает имя типа (которое вы указываете во время компиляции).
  • GetType получает тип выполнения экземпляра.
  • is возвращает true, если экземпляр в дереве наследования.

пример


насчет typeof(T) ? Он также разрешен во время компиляции?

да. T-это всегда тип выражения. Помните, что общий метод-это в основном целая куча методов с соответствующим типом. Пример:

использовать typeof когда вы хотите сделать типа компиляции. Использовать GetType когда вы хотите сделать типа срок исполнения. Редко бывают случаи использования is как это делает бросок и, в большинстве случаев, вы в конечном итоге в любом случае переменная.

есть четвертый вариант, который вы не рассматривали (особенно, если вы собираетесь привести объект к типу, который вы найдете); то есть использовать as .

этот только использует один cast тогда как этот подход:

требует два.

1.

это незаконно, потому что typeof работает только с типами, а не с переменными. Я предполагаю, что obj1 является переменной. Таким образом, typeof является статическим и выполняет свою работу во время компиляции, а не во время выполнения.

2.

Это верно, если obj1 точно имеет тип int. Если obj1 происходит от int, условие if будет false.

3.

Это верно, если obj1 int, или если это происходит из класса int, или если он реализует интерфейс инт.

это ошибка. Оператор typeof в C# может принимать только имена типов, а не объекты.

это сработает, но, возможно, не так, как вы ожидали. Для типов значений, как вы показали здесь, это приемлемо, но для ссылочных типов он вернет true, только если тип был тот же введите, а не что-то еще в иерархии наследования. Например:

это печати «o is something else» , потому что типа o is Dog , а не Animal . Вы можете сделать эту работу, однако, если вы используете IsAssignableFrom метод Type класса.

эта техника все еще оставляет серьезную проблему. Если ваша переменная равна null, вызов GetType() выдаст исключение NullReferenceException. Поэтому, чтобы заставить его работать правильно, вы бы сделали:

С этим, у вас есть эквивалентное поведение is ключевое слово. Следовательно, если это поведение, которое вы хотите, вы должны использовать is ключевое слово, которое является более читаемым и более эффективным.

в большинстве случаев, однако, is ключевое слово все еще не то, что вы действительно хотите, потому что обычно недостаточно просто знать, что объект определенного типа. Обычно, вы хотите на самом деле использовать этот объект как экземпляр этого типа, который требует приведения его тоже. И поэтому вы можете обнаружить, что пишете код следующим образом:

но это заставляет CLR проверять тип объекта до двух раз. Он проверит его один раз, чтобы удовлетворить is оператора, и если o действительно Animal , мы делаем это проверить еще раз, чтобы проверить бросок.

это более эффективно сделать это вместо этого:

на as оператор-это приведение, которое не будет выдавать исключение, если оно не сработает, вместо этого возвращая null . Таким образом, среда CLR проверяет тип объекта только один раз, и после этого нам просто нужно выполнить проверку null, которая больше эффективный.

но будьте осторожны: многие люди попадают в ловушку с as . Поскольку он не бросает исключений, некоторые люди думают о нем как о» безопасном » броске, и они используют его исключительно, избегая регулярных бросков. Это приводит к таким ошибкам:

в этом случае, разработчик явно предполагая, что o будет всегда быть Animal , и пока их предположение верно, то все работает нормально. Но если они ошибаются, то что они в конечном итоге здесь есть NullReferenceException . С обычным гипсом они бы получили InvalidCastException вместо этого, который бы более правильно определил проблему.

иногда эту ошибку трудно найти:

это еще один случай, когда разработчик явно ожидая o быть Animal каждый раз, но это не очевидно в конструктор, где as используется cast. Это не очевидно, пока вы не доберетесь до Interact способ, где animal ожидается, что поле будет положительно назначено. В этом случае вы не только получаете вводящее в заблуждение исключение, но оно не выдается до потенциально намного позже, чем когда произошла фактическая ошибка.

Если вам нужно только знать, является ли объект какого-либо типа, используйте is .

Если вам нужно обработать объект как экземпляр определенного типа, но вы не знаете точно, что объект будет такого типа, use as и чек на null .

Если вам нужно обработать объект как экземпляр определенного типа, и объект должен быть того типа, использовать обычный литой.

я Type — свойство для сравнения и не может использовать is (как my_type is _BaseTypetoLookFor ), но я мог бы использовать:

обратите внимание, что IsInstanceOfType и IsAssignableFrom возвращение true при сравнении тех же типов, где IsSubClassOf будет возвращать false . И IsSubclassOf не работает на интерфейсах, где другие две. (См. также этот вопрос и ответ.)

Если вы используете C# 7, то пришло время обновить отличный ответ Эндрю Хара. шаблоны ввел хороший ярлык, который дает нам типизированную переменную в контексте оператора if, не требуя отдельного объявления / приведения и проверки:

Это выглядит довольно не впечатляет для одного актера, как это, но действительно сияет, когда у вас есть много возможных типов, входящих в вашу рутину. Ниже приведен старый способ избежать литья дважды:

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


EDIT: обновлен более длинный новый метод для использования коммутатора в соответствии с комментарием Palec.

что сказал, Если вы используете is, вы, вероятно,не использование наследования правильно.

предположим, что человек: сущность и животное : сущность. Feed-это виртуальный метод в Entity (чтобы сделать Нила счастливым)

Я считаю, что последний также смотрит на наследование (например, собака-животное == true), что лучше в большинстве случаев.

Это зависит от того, что я делаю. Если мне нужно значение bool (скажем, чтобы определить, буду ли я использовать int), я буду использовать is . Если мне действительно нужен тип по какой-то причине (скажем, для перехода к другому методу), я буду использовать GetType() .

последний более чистый, более очевидный, а также проверяет подтипы. Остальные не проверяют на полиморфизм.

используется для получения системы.Тип объекта для типа. Выражение typeof принимает следующую форму:

в этом примере используется метод GetType для определения типа, используемого для хранения результата числового вычисления. Это зависит от требований хранения результирующего числа.

вы можете использовать оператор «typeof ()» в C#, но вам нужно вызвать пространство имен с помощью System.IO; вы должны использовать ключевое слово «is», если хотите проверить тип.

тест производительности typeof () vs GetType ():

Gettype — получает тип переменной.

gettype
Получает тип переменной.

Синтаксис :
string gettype(mixed var);
Возвращает тип переменной PHP var.
Возможные значения для возвращаемой строки:
«integer»
«double»
«string»
«array»
«object»
«unknown type»

intval
Возвращает целочисленное значение переменной.

Синтаксис :
int intval(mixed var, int [base]);

Возвращает целочисленное значение переменной var, используя указанное основание для перевода (по умолчанию 10). var может быть скалярного типа. Вы не можете использовать функцию intval() для массивов или объектов.

doubleval
Получает значение переменной в формате double.

Синтаксис :
double doubleval(mixed var);

Возвращает double (с плавающей точкой) значение переменной var.
var может быть скалярного типа. Вы не можете использовать doubleval() на массивах и объектах.

empty
Определяет, есть ли у переменной какое либо значение.

Синтаксис :
int empty(mixed var);

Возвращает false, если var существует и имеет не пустое или не нулевое значение; true в обратном случае.
Фактически функция проверяет, имеет ли переменнная значение, которое может быть приравнено к 0, то есть: (var==0) Заметьте, что эту функцию бесполезно использовать с аргументом, отличным от переменной, например выражение empty (Addslashes($name)) бессмысленно, т.к. здесь проверяется значение, возвращаемое функцией. Единственное, что может выявить в данном варианте функция empty() , это имеет ли выражение значение, эквивалентное true (не равное нулю), а это может быть проверено и без использования функции.

isset
Определяет, существует ли переменная.

Синтаксис :
int isset(mixed var);

Возвращает true, если var существует; false в обратном случае.
Фактически функция проверяет, имеет ли переменная значение, идентичное null, то есть: (var===null). Отметьте различие между равенством и идентичностью.
Если переменная была удалена функцией unset(), она больше не будет определяться функцией isset().

settype
Устанавливает тип переменной.

Синтаксис :
int settype(string var, string type);

Устанавливает тип переменнойvar на type.
Возможные значения type :
«integer»
«double»»
«string»
«array»»
«object»
Возвращает true, при успехе; false в обратном случае.

strval
Получает строковое значение переменной.

Синтаксис :
string strval(mixed var);

Получает строковое значение var.
var может быть любого скалярного типа. Вы не можете использовать strval() на массивах или объектах.

unset
Удаляет указанную переменную.

Синтаксис :
int unset(mixed var);

unset() уничтожает указанную переменную и возвращает true.
Пример :
unset( $foo );
unset( $bar[«quux»] );

Илон Маск рекомендует:  Asp поддержка клиентов, использующих другие языки
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL