Почему я не объявляю NSInteger с *

Вы говорите, что смотрите на строки, как насчет чего-то подобного, о котором кто-то уже прокомментировал.

        var items = new List<string>();

        items.Add("string1");
        items.Add("string2");

        if (items.Contains("string2"))
        {
            // do something
        }

Вы даже можете получить значения из какого-либо файла конфигурации, чтобы заполнить список.

42
задан gargantuan 18 June 2009 в 17:29
поделиться

4 ответа

NSInteger - это примитивный тип, что означает, что он может храниться локально в стеке . Вам не нужно использовать указатель для доступа к нему, но вы можете, если хотите. Строка:

NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier];

возвращает фактическую переменную, а не ее адрес. Чтобы исправить это, вам нужно удалить * :

NSInteger processID = [[NSProcessInfo processInfo] processIdentifier];

У вас может быть указатель на NSInteger , если он вам действительно нужен:

NSInteger *pointerToProcessID = &processID;

Амперсанд - это адрес оператора . Он устанавливает указатель на NSInteger равным адресу переменной в памяти, а не целому числу в переменной.

70
ответ дан 26 November 2019 в 23:32
поделиться

Причина, по которой вы не объявляете NSInteger с * потому, что это не объект. NSInteger - это просто int или long :

#if __LP64__
typedef long NSInteger;
#else
typedef int NSInteger;
endif

Если он используется в 32-битном приложении, это 32-битное целое число, и если оно создается в 64-битное приложение, это 64-битное целое число.

Конечно, вы можете передать NSInteger в качестве указателя, но большинство функций просто принимают аргументы как NSInteger , а не указатель на него.

Объекты, с другой стороны, могут передаваться другим функциям только как указатели. Это связано с тем, что для объектов динамически выделяется память, поэтому их нельзя объявлять в стеке. Поскольку для int или long выделен фиксированный объем памяти, это не проблема.

25
ответ дан 26 November 2019 в 23:32
поделиться

* означает «указатель». Переменная объекта содержит указатель на объект, поэтому он имеет * ; переменная NSInteger содержит NSInteger, а не указатель на NSInteger, поэтому у нее нет * . Добавление * в эту переменную дает вам как минимум предупреждение, потому что вы помещаете целое число в переменную-указатель.

3
ответ дан 26 November 2019 в 23:32
поделиться

Несколько возможностей:

  • Ваше .NET-приложение может не указывать туда, куда вы или они думаете, что оно указывает. Например, он по ошибке указал на тестовый сервер

  • . Если в представлении есть индекс для плавающего или числового значения, значение может отличаться от базового запроса из-за округления

  • Параметр ANSI_NULLS специфичен для представления когда он был создан. Если он отличается от настройки во время выбора (ов) в базовых таблицах, это может вызвать расхождения для определенных типов запросов

  • . Базовые структуры таблиц изменились, а представление не обновилось (особенно проблема, если он использует " SELECT * ")

Я отредактирую этот пост, если вспомню о других.

РЕДАКТИРОВАТЬ: Вот пример того, как параметр ANSI_NULLS может отбросить ваши результаты:

SET ANSI_NULLS ON

DECLARE
     @i     INT,
     @j     INT

SET @i = NULL
SET @j = 1

SELECT
     CASE WHEN @i <> @j THEN 'Not Equal' ELSE 'Equal' END

SET ANSI_NULLS OFF

SELECT
     CASE WHEN @i <> @j THEN 'Not Equal' ELSE 'Equal' END

Вы должны получить следующие результаты:

2
ответ дан 26 November 2019 в 23:32
поделиться