天天看点

C#学习笔记之四(Attribute, Reflection, Thread, Thread Synchronization)

Atributes:

 //can add metadata in program, It store with the program

 //using ILDasm to check atributes

 //usage

 [CodeReviewAttribute("08/08/2005", "Allan Zhang",

  Comment = "That is a Attribute test")]

 class Employee {}

 //define target and atr

 [AttributeUsage(AttributeTargets.Class |

   AttributeTargets.Constructor |

   AttributeTargets.Interface |

   AttributeTargets.Method |

   AttributeTargets.Field |

   AttributeTargets.Property,

   AllowMultiple=true)]

 class CodeReviewAtrribute : System.Attribute

 {

  private string reviewDate;

  private string reviewerName;

  private string reviewComments;

  ...

 }

Reflections: //look the metadata in program, discory, late binding

 //Display attribute in Code

 System.Reflection.MemberInfo inf = typeof(Employee);

 object[] atributes = inf.GetCustomAttributes(false);

 foreach (object attribute in attributes)

 {

  CodeReviewAttribute attr = (CodeReviewAttribute) attribute;

  Console.WriteLine("This is code was reviewed on {0} by {1} /n Comments {2}",

    attr.date,

    attr.name,

    attr.comment )

 } 

 //Discovery

 Assembly asm = Assembly.Load("Mscorlib.dll");

 Type[] types = asm.GetTypes();

 foreach(Type type in types)

 {

  Console.WriteLine("Type is{0}, type);

  Console.WriteLine("/n{0} types found." types.Length);

 }

 //LateBinding

 Type mathType =Type.GetType("System.Math");

 object obj = Activator.CreaterInstance(mathType);

 Type[] parameterTypes = new Type[2];

 parameterTypes[0] = Type.GetType("System.Double");

 parameterTypes[1] = Type.GetType("System.Double");

 MethodInfo powInfo = mathType.GetMethod("Pow", parameterTypes);

 object[] parameters = new object[2];

 parameters[0] = 5;

 parameters[1] = 3;

 object returnValue = powInfo.Invoke(obj, parameters);

 Console.WriteLine("5 to the 3rd power is {0}, returnValue);

Thread:

 //Create Implicit Threads

 using System.Threading

 Thread threadOne = new Thread(new ThreadStart(Countup));

 Thread threadTwo = new Thread(new ThreadStart(Countup));

 threadOne.Name = "Thread One";

 threadTwo.Name = "Thread two";

 threadOne.Start();

 threadTwo.Start();

 //Joining & killing Threads

 //join two threads in current threa

 threadOne.start();

  threadTwo.Start();

  threadOne.Join();

  threadTwo.Join();

  //this will print, after two above two threads ends

  Console.WriteLine("The other threads done");  

 //sleep(millisenconds)

 threadOne.sleep(1);

 threadOne.Abort();

Synchronization:

 //1. no conflict between threads

 interlocked.Increment(ref synchValue);

 //2. lock method, this will block other thread when it enter into it

 lock(this)

 {

  int temp = synchValue;

  temp++;

  Thread.Sleep(2);

  synchValue = temp;

  synchValue = temp;

  Console.WriteLine("{0} Count up: {1}",

    Thread.CurrentThread.Name,

    synchValue);

 }  

继续阅读