это случилось со мной, когда я импортировал приложение Android Studio в eclipse.
Я выяснил, что файл andoridmanifest.xml должен быть слегка изменен при импорте из проекта студии Android. Я создал новый тестовый проект и скопировал заголовки, чтобы они совпадали. вуаля, проблема решена.
Да, это будет работать, проверить этот запускающий тест:
[TestMethod]
public void TestMethod8()
{
using (new MyClass() as IDisposable)
{
}
}
public class MyClass { }
Это просто работает без любой проблемы. Если соответствующий класс реализует IDisposable, то он назовет его, если не он будет все еще работать/выполнять :).
Обновление: Как другие сказали, я также задаюсь вопросом, что проку, Вы хотите дать ему. Мое предположение - Вы, имеют что-то как фабрика, которая может получить экземпляры от различных классов, которые могут или не могут быть доступными :).
Да. A using
оператор проверяет, дается ли он null
и старается не пытаться звонить Dispose
раз так.
От раздела 8.13 из спецификации C# 3:
Оператор использования переводится в три части: приобретение, использование и распоряжение. Использование ресурса неявно включается в оператор попытки, который включает наконец пункт. Это наконец пункт избавляется от ресурса. Если пустой ресурс получен, то никакой вызов для Расположения не выполняется, и никакое исключение не выдается.
Это должно хорошо работать, даже если не "правильный" подход к избавлению от ресурсов. using
statment является просто синтаксическим сахаром для
IDisposable o = ...;
try
{
// ...
}
finally
{
if (o != null)
o.Dispose(true);
}
Таким образом, если o никогда не реализован IDisposable
это было бы пустым в using
оператор и это попытались бы звонить Dispose
на нем.
При тестировании кода это, кажется, не приводит к любой компиляции - или ошибки периода выполнения.
Из определения языка (см. раздел 8.13):-
Если пустой ресурс получен, то никакой вызов для Расположения не выполняется, и никакое исключение не выдается.
Если тип не конвертируем к IDisposible, поскольку оператор переведет ресурс в пустой указатель, и код, инкапсулировавший в блоке использования, выполнится превосходный, ведя себя точно то же, как будто Вы не включили его в блок использования.
Короче говоря, ответ на Ваш вопрос - да.
Если "им будет работать", Вы подразумеваете, что получите ошибку периода выполнения? Нет, Вы не будете.
Что проку от этого? Каково преимущество? Каково преимущество?
Оператор использования удостоверится, что Расположить метод называют, но если Ваш объект не реализует IDisposable, я вижу, что нет смысла делает это? Это будет работать (как в, это не выдаст исключения на этапе выполнения, и это скомпилирует), я только что протестировал его здесь, но...
С кодом Вы записали, Вы не можете даже использовать ресурс, как являющийся IDisposable...
Может быть полезно, когда тип явно реализует IDisposable, в этом случае, Расположить метод не непосредственно доступен на типе, если тип не является литым к IDisposable, Используя, 'как' делает безопасный бросок и гарантирует, чтобы Расположили, назван. В большинстве случаев, когда тип явно реализует IDisposable, он предоставляет методы такой как 'Близко', который в свою очередь звонит, Располагают
Я полагаю, что компилятор действительно добавляет проверки, чтобы определить, является ли это пустым прежде, чем попытаться звонить, Располагают.
http://aspnetresources.com/blog/the_very_handy_using_statement.aspx