Re[11]: Отлов исключений внутри сборки
От: _FRED_ Россия
Дата: 25.03.09 06:21
Оценка: 195 (11) +1
Здравствуйте, _FRED_, Вы писали:

Y>>Вовсе не хотел подвергать сомнению возможность подкашивания Мироздания.

Y>>Мне правда интересно, что автор делать-то в таком случае собирается.

_FR>В С++, например, оператор new может вернуть NULL (кстати, может и в C# тоже, доберусь до студии, проверю). И это надо учитывать.


Вот пример, в котором оператор new возвращает null:
#region Using's

using System;
using System.Diagnostics;
using System.Runtime.Remoting.Proxies;

#endregion Using's

internal static class Program
{
  private static void Main() {
    var instance = new MyClass();
    Debug.Assert(instance == null, "instance == null");
  }
}

[MyProxy]
internal sealed class MyClass : ContextBoundObject
{
}

internal sealed class MyProxyAttribute : ProxyAttribute
{
  #region Overrides

  public override MarshalByRefObject CreateInstance(Type type) {
    return null;
  }

  #endregion Overrides
}


А вот простой пример, в котором GetType() возвращает null:
#region Using's

using System;
using System.Diagnostics;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Proxies;

#endregion Using's

internal static class Program
{
  private static void Main() {
    var instance = GetMyClass();
    var type = instance.GetType();
    Debug.Assert(type == null, "type == null");
  }

  private static MyClass GetMyClass() {
    var instance = new MyClass();
    var proxy = new MyProxy(instance);
    return (MyClass)proxy.GetTransparentProxy();
  }
}

internal class MyClass : MarshalByRefObject
{
}

internal sealed class MyProxy : RealProxy
{
  #region Fields

  private readonly MyClass instance;

  #endregion Fields

  #region Constructor(s)

  public MyProxy(MyClass instance)
    : base(instance != null ? instance.GetType() : typeof(MyClass)) {
    if(instance == null) {
      throw new ArgumentNullException("instance");
    }//if

    this.instance = instance;
  }

  #endregion Constructor(s)

  #region Properties

  private MyClass Instance {
    [DebuggerStepThrough]
    get { return instance; }
  }

  #endregion Properties

  #region Overrides

  public override IMessage Invoke(IMessage msg) {
    var call = msg as IMethodCallMessage;
    if(call != null) {
      Func<Type> func = GetType;
      if(call.MethodBase == func.Method) {
        return new ReturnMessage(null, null, 0, null, call);
      }//if
    }//if

    return RemotingServices.ExecuteMessage(Instance, call);
  }

  #endregion Overrides
}
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.