Здравствуйте, _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
}