.


:




:

































 

 

 

 





, .

, . , .

 

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 - . , , .





:


: 2016-11-24; !; : 308 |


:

:

, .
==> ...

1757 - | 1563 -


© 2015-2024 lektsii.org - -

: 0.025 .