1: class Program
   2: {
   3:     static void Main(string[] args)
   4:     {
   5:         string callerString1 = "CallerValue1";
   6:         string callerString2 = "CallerValue2";
   7:         string callerString3 = callerString1;
   8:         string callerString4 = callerString2;
   9:  
  10:         string stringBefore = "callerString1=" + callerString1 + " callerString2=" + callerString2 + " callerString3=" + callerString3 + " callerString4=" + callerString4;
  11:  
  12:         int int1 = 8;
  13:         int int2 = 9;
  14:         int int3 = int1;
  15:         int int4 = int2;
  16:         string intBefore = "int1=" + int1 + " int2=" + int2 + " int3=" + int3 + " int4=" + int4;
  17:  
  18:         MyType objTest1 = new MyType();
  19:         MyType objTestTemp1 = new MyType();
  20:         objTest1.X = 10;
  21:         objTestTemp1 = objTest1;
  22:  
  23:         string objectBefore1 = "objTest1.X=" + objTest1.X + " objTestTemp1.X=" + objTestTemp1.X;
  24:  
  25:         MyType objTest2 = new MyType();
  26:         MyType objTestTemp2 = new MyType();
  27:         objTest2.X = 11;
  28:         objTestTemp2 = objTest2;
  29:  
  30:         string objectBefore2 = "objTest2.X=" + objTest2.X + " objTestTemp2.X=" + objTestTemp2.X;
  31:  
  32:         prova(callerString1, ref callerString2, int1, ref int2, objTest1, ref objTest2);
  33:  
  34:         string stringAfter = "callerString1=" + callerString1 + " callerString2=" + callerString2 + " callerString3=" + callerString3 + " callerString4=" + callerString4;
  35:         string intAfter = "int1=" + int1 + " int2=" + int2 + " int3=" + int3 + " int4=" + int4;
  36:         string objectAfter1 = "objTest1.X=" + objTest1.X + " objTestTemp1.X=" + objTestTemp1.X;
  37:         string objectAfter2 = "objTest2.X=" + objTest2.X + " objTestTemp2.X=" + objTestTemp2.X;
  38:  
  39:         Console.Out.WriteLine(stringBefore);
  40:         Console.Out.WriteLine(stringAfter);
  41:         Console.Out.WriteLine(intBefore);
  42:         Console.Out.WriteLine(intAfter);
  43:         Console.Out.WriteLine();
  44:         Console.Out.WriteLine(objectBefore1);
  45:         Console.Out.WriteLine(objectAfter1);
  46:         Console.Out.WriteLine();
  47:         Console.Out.WriteLine(objectBefore2);
  48:         Console.Out.WriteLine(objectAfter2);
  49:  
  50:     }
  51:  
  52:     private static void prova(string string1, ref string string2, int methodInt1, ref int methodInt2, MyType methodObjProva1, ref MyType methodObjProva2)
  53:     {
  54:         string string3 = "MethodValue5";
  55:         string1 = "MethodValue1";
  56:         string1 = string3;
  57:         string1 = "MethodValue2";
  58:  
  59:         string string4 = "MethodValue6";
  60:         string2 = "MethodValue3";
  61:         string2 = string4;
  62:         string2 = "MethodValue4";
  63:  
  64:         methodInt1 = 1;
  65:         int internalInt = 10;
  66:         methodInt1 = internalInt;
  67:  
  68:         methodInt2 = 1;
  69:         methodInt2 = internalInt;
  70:  
  71:         MyType internalMyType1 = new MyType();
  72:         internalMyType1.X = -3;
  73:  
  74:         methodObjProva1.X = -4;
  75:  
  76:         methodObjProva1 = internalMyType1;
  77:         methodObjProva1.X = -5;
  78:  
  79:         MyType internalMyType2 = new MyType();
  80:         methodObjProva2.X = -6;
  81:         methodObjProva2 = internalMyType2;
  82:         methodObjProva2.X = -7;
  83:  
  84:     }
  85: }
  86: public class MyType
  87: {
  88:     int x = 0;
  89:  
  90:     public int X
  91:     {
  92:         get { return x; }
  93:         set { x = value; }
  94:     }
  95: }