В целом нет никакой потребности к несуществующим объектам после использования, но в некоторых случаях я нахожу, что это - хорошая практика.
, Если объект реализует IDisposable и хранится в поле, я думаю, что хорошо аннулировать его, только избегать использования склонного объекта. Ошибки следующего вида могут быть болезненными:
this.myField.Dispose();
// ... at some later time
this.myField.DoSomething();
хорошо аннулировать поле после расположения его и разобраться в NullPtrEx в строке, где поле используется снова. Иначе Вы могли бы столкнуться с некоторой загадочной ошибкой по линии (в зависимости от точно, что DoSomething делает).
Итак, вы ищете байт с умным исключающим ИЛИ по сравнению с битом с умным исключающим ИЛИ. Похоже, вы ищете что-то, что будет работать с байтом как «включено» или «выключено», так как считалось, что байты равны «0» или «ненулевые», а затем XOR их. Похоже, вы хотите сжать каждый байт в один бит, указывающий истину или ложь. Итак, похоже, вы хотите (a! = 0) ^ (b! = 0)
a b a YOURXOR b a!=0 b!=0 (a!=0)^(b!=0) 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 7 0 1 1 0 1 0 7 1 0 1 1 3 7 0 1 1 0 7 3 0 1 1 0 7 7 0 1 1 0
Что касается того, почему это не на всех языках ... я не могу ответить. Однако это не так уж и сложно реализовать с помощью строительных блоков побитового xor, доступного на каждом языке, и ни один язык не предлагает все возможные функции - они просто предлагают достаточно, чтобы позволить вам создавать расширенные функции, которые могут вам понадобиться. Ой, и если бы это была достаточно популярная проблема, вы бы ожидали увидеть повсюду библиотеки или макросы для ее решения; хотя я, возможно, не произвел достаточного поиска таких библиотек / кода, я сам их не нашел, что указывает на то, что это требование либо тривиально для написания, либо является нишевым требованием.
Почти на всех языках имеет логический XOR. Символы, которые они используют для этого, различаются, но независимо от символа большинство людей произносят его «не равно».
Редактировать: для тех, кто сомневается, тестовый код для трех переменных:
#include <iostream>
int main() {
for (int i=0; i<2; i++)
for (int j=0; j<2; j++)
for (int k=0; k<2; k++) {
std::cout << "\n!=" << (i!=j!=k);
std::cout << "\t^ " << (i^j^k);
}
return 0;
}
Что вы подразумеваете под «логическим оператором XOR»? Я не уверен, какой результат вы ожидаете от своих примеров, но вот мой ответ:
a (логический XOR) b
то же самое, что bool (a)! = Bool (b)
Неравенство - это логическая операция XOR. Поскольку у вас уже есть версия побитового XOR, вам не нужен специальный оператор для логического.
Вероятно потому, что XOR обычно не требуется в качестве логического оператора, и вы можете сделать это почти так же легко, как это:
// foo xor bar
(foo & !bar) || (bar & !foo)
// or like this (assuming foo and bar are booleans)
!(foo==bar)
// assume boleans that can be cast as integers with true=1 and false=0
// foo XOR bar XOR baz XOR alice
((int)foo + (int)bar + (int)baz + (int)alice)&0b1
Единственная причина, по которой я могу думать, это то, что операция выполняется относительно редко. Я не понимаю, почему ему нельзя было присвоить что-то вроде ^^, возможно, люди, которые разрабатывают языки, хотят избежать беспорядка с операторами.
Что касается его бесполезности, потому что его нельзя замкнуть накоротко, во многих Строго типизированные языки, вы не можете использовать побитовый оператор XOR для сравнения логических значений без преобразования вперед и назад, и в этом случае имеет смысл использовать даже логический XOR без короткого замыкания.
Вы также можете написать !a ^ !b
, чтобы получить тот же эффект, что и логический xor.
Скорее всего, вы не найдете логический xor в языках программирования, потому что: