Могу ли я иметь другой тип объектов в C # *, используя * блок? - PullRequest
5 голосов
/ 22 июня 2010
using (Font font3 = new Font("Arial", 10.0f), 
           font4 = new Font("Arial", 10.0f))
{
    // Use font3 and font4.
}

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

Не могу ли я использовать различные типы объектов внутри с использованием предложение?

Ну, я пытался, но, хотя они были разными именами и разными объектами, они действовали одинаково = имели одинаковый набор методов

Есть ли другой способ использовать класс using с разнымитипы?

Если нет, то как лучше всего его использовать?

Ответы [ 7 ]

28 голосов
/ 22 июня 2010
using(Font f1 = new Font("Arial",10.0f))
using (Font f2 = new Font("Arial", 10.0f))
using (Stream s = new MemoryStream())
{

}

Как так?

10 голосов
/ 22 июня 2010

Нет, вы не можете сделать это таким образом, но вы можете nest блоки using.

using (Font font3 = new Font("Arial", 10.0f))
{ 
    using (Font font4 = new Font("Arial", 10.0f))
    {
        // Use font3 and font4.
    }
}

или, как говорили другие, но я бы не стал так рекомендовать из-за читабельности.

using(Font font3 = new Font("Arial", 10.0f))
using(Font font4 = new Font("Arial", 10.0f))
{
    // use font3 and font4
}
6 голосов
/ 22 июня 2010

Для этого можно использовать операторы:

using(Font font3 = new Font("Arial", 10.0f))
using(Font font4 = new Font("Arial", 10.0f))
{
    // use font3 and font4
}
5 голосов
/ 22 июня 2010

Цель оператора using состоит в том, чтобы гарантировать, что полученные ресурсы явным образом утилизируются путем вызова метода Dispose, предоставляемого интерфейсом IDisposable. Спецификация не позволяет вам получать ресурсы разных типов внутри одного оператора using, но, имея в виду первое предложение, вы можете написать этот совершенно правильный код с точки зрения компилятора.

using (IDisposable d1 = new Font("Arial", 10.0f),
    d2 = new Font("Arial", 10.0f), 
    d3 = new MemoryStream())
{
    var stream1 = (MemoryStream)d3;
    stream1.WriteByte(0x30);
}

Однако, Я не рекомендую это и считаю его оскорбительным, поэтому этот ответ просто состоит в том, чтобы заявить, что вы можете взломать его, но, вероятно, не следует.

3 голосов
/ 22 июня 2010

Вы можете разделять запятыми элементы одного типа - ну, все, что я знаю, это то, что компилятор не жалуется. Вы также можете составлять операторы () (используйте один набор скобок {}) разных типов.

http://adamhouldsworth.blogspot.com/2010/02/things-you-dont-know.html

3 голосов
/ 22 июня 2010

В каждом блоке using можно инициализировать только один тип объекта. Тем не менее, вы можете вкладывать их столько, сколько хотите:

using (Font font3 = new Font("Arial", 10.0f))
{
    using (Brush b4 = new Brush())
    {

    }
}
2 голосов
/ 22 июня 2010

Вы можете вкладывать их:

using (Font font3 = new Font("Arial", 10.0f))
using (font4 = new Font("Arial", 10.0f))
{
    // Use font3 and font4.
}

Они должны располагаться в обратном порядке (сначала font4).

РЕДАКТИРОВАТЬ:

Это точно так же, как:

using (Font font3 = new Font("Arial", 10.0f))
{
    using (font4 = new Font("Arial", 10.0f))
    {
        // Use font3 and font4.
    }
}
...