, .
, . , .
int result = 0;
for (int i = 1; i <= valMax; i++)
result += i;
, .. . , !
valMax. valMax .
, valMax , . , valMax, . , valMax = 20 .
int result = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10
+ 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20;
? . , ! , .
. , . , .
Reflection. Emit . , , . " " !
:
using System;
using System.Reflection;
using System.Reflection.Emit;
namespace DynUnloop
{ //
class SumLooping
{ public int Summ(int valMax)
{ int result = 0;
for (int i = 0; i <= valMax; i++)
result += i;
return result;
}
}
//
class SumFlat
{ interface ISumCode
{ int ComputeSumm(int valMax);
}
void WriteCode(int valMax)
{ AssemblyName assemblyName = new AssemblyName();
assemblyName.Name = "SumFlatAssembly";
AssemblyBuilder assemblyBuilder =
AppDomain.CurrentDomain.DefineDynamicAssembly(
assemblyName, AssemblyBuilderAccess.Run);
ModuleBuilder moduleBuilder =
assemblyBuilder.DefineDynamicModule("SumFlatModule");
|
|
TypeBuilder typeBuilder =
moduleBuilder.DefineType("SumFlatClass"
, TypeAttributes.Public);
typeBuilder.AddInterfaceImplementation(typeof(ISumCode));
///
Type[] paramTypes = { typeof(int) };
Type returnType = typeof(int);
MethodBuilder methodBuilder =
typeBuilder.DefineMethod("ComputeSumm"
, MethodAttributes.Public
| MethodAttributes.Virtual
, returnType, paramTypes);
ILGenerator il = methodBuilder.GetILGenerator();
// .
il.Emit(OpCodes.Ldc_I4, 0);
for (int i = 1; i <= valMax; i++)
{ il.Emit(OpCodes.Ldc_I4, i);
il.Emit(OpCodes.Add);
}
il.Emit(OpCodes.Ret);
// ComputeSumm SumFlatClass.
MethodInfo methodInfo =
typeof(ISumCode).GetMethod("ComputeSumm");
typeBuilder.DefineMethodOverride(methodBuilder, methodInfo);
typeBuilder.CreateType();
/// , .
code = (ISumCode)assemblyBuilder.CreateInstance("SumFlatClass");
}
public int Summ(int val)
{ if (this.code == null)
WriteCode(val);
return this.code.ComputeSumm(val);
}
ISumCode code;
}
class Test
{ static void Main()
{ const int valMax = 3000;
const int countIterations = 200000;
////////////////////////////////////////////
SumLooping sumLoop = new SumLooping();
DateTime start = DateTime.Now;
int sum = 0;
for (int it = 0; it < countIterations; it++)
sum = sumLoop.Summ(valMax);
TimeSpan span = DateTime.Now - start;
Console.WriteLine("Sum Looping. Sum = {0}, Elapsed msec= {1}"
, sum, span.TotalMilliseconds);
///////////////////////////////////////////
SumFlat sumFlat = new SumFlat();
DateTime start2 = DateTime.Now;
int sum2 = 0;
for (int it = 0; it < countIterations; it++)
sum2 = sumFlat.Summ(valMax);;
TimeSpan span2 = DateTime.Now - start2;
Console.WriteLine("Sum Flat. Sum = {0}, Elapsed msec= {1}"
, sum2, span2.TotalMilliseconds);
Console.ReadLine();
}
}
}
:
Sum Looping. Sum = 4501500, Elapsed msec= 4967,1424
Sum Flat. Sum = 4501500, Elapsed msec= 731,0512
4-7 .
. , , ( ). .
, , , . - Op- MSIL, , Reflection. Emit . .NET ? C#, ? .
- , , .. - (, ..), , , . .
|
|
, System.Attribute.
, , .
, - , . . , , . , .
.NET - System.Attribute.
Attribute System :
- GetType - Type ;
- ToString - , ;
- IsDefined - , , ;
- GetCustomAttribute - .
Attribute TypeId, .
public.
. , public -.
, . :
[ObsoleteAttribute("Hallow World")]
# Attribute. ,
[ObsoleteAttribute("Hallow World")]
[Obsolete ("Hallow World")]
() , .
, :
[Serializable]
Class Student
{string Name;
int age
}
, . , , , :
- .NET Framework;
- .
:
1. .NET Framework ;
2. .
, , ( ) . , , - , , .
, . , .. - , , .. IDE Visual Studio Properties - . , , .