Обеспечение требуемого вызова функции - PullRequest
9 голосов
/ 21 августа 2008

У меня есть класс "Status" в C #, используемый следующим образом:

Status MyFunction()
{
   if(...) // something bad
     return new Status(false, "Something went wrong")
   else
     return new Status(true, "OK");
}

Вы поняли идею. Все абоненты MyFunction должны проверить возвращенный статус:

Status myStatus = MyFunction();
if ( ! myStatus.IsOK() )
   // handle it, show a message,...

Ленивые абоненты могут игнорировать статус.

MyFunction(); // call function and ignore returned Status

или

{
  Status myStatus = MyFunction(); 
} // lose all references to myStatus, without calling IsOK() on it

Возможно ли сделать это невозможным? например исключение броска

В общем : возможно ли написать класс C #, для которого у вас есть для вызова определенной функции?

В C ++ версии класса Status я могу написать тест для некоторого приватного bool bIsChecked в деструкторе и позвонить в несколько звонков, когда кто-то не проверяет этот экземпляр.

Что такое эквивалентная опция в C #? Я где-то читал, что «Вы не хотите деструктора в своем классе C #»

Является ли метод Dispose интерфейса IDisposable параметром?

В этом случае нет неуправляемых ресурсов для освобождения. Кроме того, не определено, когда GC удалит объект. Когда он в конечном итоге будет утилизирован, все еще можно будет узнать, где и когда вы проигнорировали этот конкретный экземпляр статуса? Ключевое слово "using" действительно помогает, но опять же, оно не требуется для ленивых абонентов.

Ответы [ 11 ]

0 голосов
/ 21 августа 2008

Вы можете сгенерировать исключение по:

throw MyException;


[global::System.Serializable]
        public class MyException : Exception
        {
        //
        // For guidelines regarding the creation of new exception types, see
        //    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconerrorraisinghandlingguidelines.asp
        // and
        //    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncscol/html/csharp07192001.asp
        //

        public MyException () { }
        public MyException ( string message ) : base( message ) { }
        public MyException ( string message, Exception inner ) : base( message, inner ) { }
        protected MyException (
          System.Runtime.Serialization.SerializationInfo info,
          System.Runtime.Serialization.StreamingContext context )
            : base( info, context ) { }
    }

Вышеуказанное исключение полностью настраивается в соответствии с вашими требованиями.

Одна вещь, которую я бы сказал, это то, что я бы оставил вызывающей стороне проверить код возврата, это их ответственность, вы просто предоставляете средства и интерфейс. Кроме того, гораздо эффективнее использовать коды возврата и проверять состояние с помощью оператора if, а не выводить исключения. Если это действительно Исключительное обстоятельство, то непременно отбросьте ... но скажите, что если вам не удалось открыть устройство, то было бы разумнее придерживаться кода возврата.

...