Строка ошибки «Ссылка на объект, не установленная на экземпляр объекта.» указывает, что вы не назначили экземпляр объекта объектной ссылке, и все же вы получаете доступ к свойствам / методам этого объекта.
например: скажем, у вас есть класс под названием myClass и он содержит одно свойство prop1.
public Class myClass
{
public int prop1 {get;set;}
}
Теперь вы получаете доступ к этому prop1 в каком-то другом классе, как показано ниже:
public class Demo
{
public void testMethod()
{
myClass ref = null;
ref.prop1 = 1; //This line throws error
}
}
выше строки выдает ошибку, потому что ссылка класса myClass объявлена, но не создана, или экземпляр объекта не назначается referecne этого класса.
Чтобы исправить это, вам нужно создать экземпляр (присвоить объект ссылке на этот класс).
public class Demo
{
public void testMethod()
{
myClass ref = null;
ref = new myClass();
ref.prop1 = 1;
}
}
Нет никакой разницы в производительности.
Однако первый стиль - ANSI-89, и ваши ноги сломаны в некоторых магазинах. Включая мой. Второй стиль - ANSI-92 и намного понятнее.
Примеры:
Что такое JOIN, который является фильтром?
FROM T1,T2,T3....
WHERE T1.ID = T2.ID AND
T1.foo = 'bar' AND T2.fish = 42 AND
T1.ID = T3.ID
FROM T1
INNER JOIN T2 ON T1.ID = T2.ID
INNER JOIN T3 ON T1.ID = T3.ID
WHERE
T1.foo = 'bar' AND T2.fish = 42
Если вы имеют ВЗАИМОДЕЙСТВИЕ (=*
, *=
), тогда второй стиль будет работать так, как рекламируется. Первый, скорее всего, не будет и также устарел в SQL Server 2005 +
. Стиль ANSI-92 также сложнее для bollix. В более старом стиле вы можете легко получить декартово произведение (перекрестное соединение), если вы пропустите условие. Вы получите синтаксическую ошибку с ANSI-92.
Редактирование: некоторые дополнительные пояснения
Это не просто синтаксис : это о имеющий семантически правильный запрос
Редактировать, декабрь 2011
Порядок обработки логических запросов SQL Server - FROM, ON, JOIN, WHERE ...
Итак, если вы смешиваете «неявные внутренние соединения WHERE» и «явные внешние внешние соединения», вы, скорее всего, не получите ожидаемых результатов, потому что запрос неоднозначен ...
Это дубликат этого вопроса SO: Явное vs неявное соединение SQL . Вообще я думаю, что неявная (где версия) плохая форма и не такая ясная, как явная (в версии). Я также думаю, что имплицитный амортизируется, но не 100% на него. План выполнения одинаковый для обоих.
Я презираю, когда вы принудительно присоединяете, используя WHERE
. Мне просто не нравится, грязный хак. Правильное соединение ANSI - использовать ON:
SELECT
p.Product,
o.Order
FROM
Product p
INNER JOIN
Order o
ON
o.OrderID = p.OrderID
Предпочтительно использовать ON
при подключении и WHERE
для фильтрации результатов. Помните, что ГДЕ - одна из последних вещей, которые вы будете использовать, помимо группировки и порядка, где вы хотите отфильтровать результаты. Таким образом, вы не должны присоединяться к своим таблицам с помощью WHERE
, поскольку его трудно прочитать.
SELECT
p.Product,
o.Order
FROM
Product p
INNER JOIN
Order o
ON
o.OrderID = p.OrderID
WHERE
o.Category = 'IT'
В конце концов, вы (разработчик), возможно, не будете в будущем, поэтому читаемость и ремонтопригодность будут помогите залить душу, которая должна взять ваш код:).
Когда я вижу, что разработчики используют WHERE
для объединения своих таблиц, это обычно указывает на то, что они не знают достаточно T-SQL. Это мое личное мнение.
Разница - читаемость и ремонтопригодность. SELECT * FROM a JOIN b ON a.ID = b.ID
передает ваше точное намерение, все в одном месте.
Я не буду говорить окончательно, так как я не получил под капотом последнего оптимизатора запросов, но я уверен, смотря на тривиальную разницу в производительности, если таковая имеется.