2012-06-26 2 views
3

При переходе через некоторые учебники, я столкнулся линии, такие как это:Может ли кто-нибудь объяснить части этого синтаксиса и как он будет использоваться?

((IDisposable)foo).Dispose(); 

Игнорировать конкретную ссылку на IDisposable. Мне любопытно, почему круглые скобки установлены так, как они есть, и что они содержат/делают. Я уверен, что это очень простой вопрос для ответа, но я не смог найти ответ путем поиска из-за дженериков такого синтаксиса. Помощь будет очень признательна, спасибо.

+0

Возможно, вам интересно, почему вам нужно бросить перед вызовом Dispose, поскольку вы, вероятно, уже статически знаете, что 'foo' является' IDisposable'. Если 'foo''s, тип реализует' IDisposable' явно, то вы не можете напрямую вызывать 'foo.Dispose()', и вам нужно сделать это в первую очередь. http://msdn.microsoft.com/en-us/library/ms173157.aspx (ответ @ EugenRieck ответил на синтаксис, который был основной частью, я полагал, что это лучше подходит для комментариев) –

+0

Чтобы продолжить распространение комментария @ TimS, объект также необязательно входит в цепочку наследования того, что вы делаете в/из, поскольку пользовательские явные или неявные операторы литья могут позволить вам использовать в/из полностью несвязанных типов (хотя у него есть ограничения, например, без разрешенных интерфейсов). –

ответ

3

Первый набор скобок отливки его к IDisposable объекта. Например

Object foo = new Object(); 
IDisposable ID; 

Теперь ID = foo выдаст ошибку, но ID = (IDisposable)foo будет работать.

Второй набор круглых скобок позволяет получить доступ к методам и свойствам объектов IDisposable, в данном случае методу Dispose(). Если вы наберете его, вы увидите, что только после того, как вы включили второй набор круглых скобок, intelisense покажет вам методы и свойства объектов IDisposable.

2
  • Старт с foo
  • Prefix это с (IDisposable), чтобы привести его к требуемому интерфейсу
  • Put это в скобках, чтобы сказать, что .net foo это то, чтобы быть отлиты, а не результат foo.Dispose()
  • Теперь добавьте .Dispose() адресовать метод интерфейса
+0

+1 Ключевое слово: [** cast **] (http://msdn.microsoft.com/en-us/library/ms173105 (v = vs.80) .aspx) –

+0

Всегда будет ли это интерфейс внутри круглых скобок до foo? – Ari

+0

Нет, вы можете наложить на любой объект – Dan

0

Это просто ярлык при преобразовании в IDisposable.

Это ...

((IDisposable)foo).Dispose(); 

так же, как это ...

IDisposable i = (IDisposable)foo; 
i.Dispose(); 
0

Внутренний набор скобок вокруг IDisposable превратить его в гипсе, а затем внешний набор скобок убедитесь, что приведение происходит до вызова Dispose().

2

Синтаксис:

var d = (IDisposable)foo; 

называется Явная Cast.

Синтаксис:

((IDisposable)foo).Dispose(); 

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

Скобки сообщают компилятору порядок приоритетности действий. В этом случае говорится о том, чтобы передать переменную IDisposable перед разрешением вызова Dispose.Поскольку это сделано раньше, компилятор теперь знает, чтобы разрешить Dispose по переменной типа IDisposable.

Вы можете увидеть это поведение в других формах:

(foo as IDisposable).Dispose(); 

Или:

string s = null; 

while ((s = Console.ReadLine()) != null) 
{ 
} 

Мой первый пример бросает с помощью оператора as таким же образом, как свой собственный бросок (в линию) , Мой второй пример устанавливает переменную s перед тем, как протестировать ее против null.

Моей точкой является, ни одна из них не будет компилироваться без использования скобок для определения границ.