Вот что мы все хотим:
function Enum(constantsList) {
for (var i in constantsList) {
this[constantsList[i]] = i;
}
}
Теперь вы можете создавать свои перечисления:
var YesNo = new Enum(['NO', 'YES']);
var Color = new Enum(['RED', 'GREEN', 'BLUE']);
Таким образом, к константам можно обращаться обычным способом (Да Нет. ДА , Color.GREEN) и они получают последовательное значение типа int (NO = 0, YES = 1; RED = 0, GREEN = 1, BLUE = 2).
Вы также можете добавить методы, используя Enum.prototype:
Enum.prototype.values = function() {
return this.allValues;
/* for the above to work, you'd need to do
this.allValues = constantsList at the constructor */
};
Редактировать - небольшое улучшение - теперь с varargs: (к сожалению, это не работает должным образом в IE: S ... следует придерживаться предыдущей версии)
function Enum() {
for (var i in arguments) {
this[arguments[i]] = i;
}
}
var YesNo = new Enum('NO', 'YES');
var Color = new Enum('RED', 'GREEN', 'BLUE');
Произойдут интересные вещи.
В частности, метод dispose для SomeObject будет вызываться либо до, либо после вызова Work, поскольку он мог или не мог быть запланирован для этого точка.
После этого это зависит от того, что делает метод удаления SomeObject; если он, скажем, освобождает SqlConnection, который не используется в «Работе», тогда проблем быть не должно; Однако если SomeObject ожидает, что он не был удален, вы, вероятно, получите исключение в этом потоке.
Помните, что IDisposable
- это просто шаблон и не освобождает память, связанную с объектом. В этом случае закрытие блока using
вызовет obj.Dispose
, а другой поток, использующий obj
, продолжит выполнение.
Это создаст для вас странные проблемы, поскольку состояние obj
может быть изменено, пока другой поток его использует (все зависит от того, как реализован метод Dispose
). Излишне говорить, что это приложение IDisposable
, threading и using
оператор будет в лучшем случае проблематичным.
Объект вызовет Dispose в конце блока. Он продолжит работу, но obj станет нестабильным, поскольку Dispose предполагает закрытие соединений и т. Д. Теперь возможно, что obj будет настроен для проверки того, что что-то используется, и закрытия его впоследствии, но я бы не стал на это рассчитывать, если только вы написали объект, чтобы справиться с этим.
При выходе из блока using в основном потоке он вызывает .Dispose () объект, что может вызвать всевозможные забавные проблемы с параллелизмом. Однако объект не будет собираться сборщиком мусора - он останется, но в недопустимом состоянии, в зависимости от вашей реализации .Dispose ().