static void CorrectSwap(ref MyRefType a, ref MyRefType b)
        {
            MyRefType t = a;

            a = b;
            b = t;
        }
        static void Main9(string[] args)
        {
            ParameterTest pt = new ParameterTest();

            //var:叫做隐式类型的局部变量, 可用于向方法传参, 但不能用于定义方法参数
            var p4 = new Decimal(3.5);

            //命名参数和传参顺序:
            //尽管参数位置是i1, i2, s, 但传参计算时总是按照书写顺序的从左--->右顺序, 先算i2再算i1再算s, 最后按i1 i2 s顺序摆放
            pt.ParamMethod(i2: val++, i1: val++, s: val.ToString(), d: p4);

            int op;
            int rp = 1;

            pt.OutMethod(out op);
            pt.RefMethod(ref rp);

            //调用者为引用类型指针分配内存
            FileStream fs = null;

            //被调用者操作这个引用类型指针
            ProcessFile(ref fs);

            MyRefType a = new MyRefType(5);
            MyRefType b = new MyRefType(10);

            WrongSwap(a, b);
            Console.WriteLine(a.Log() + "," + b.Log());
            CorrectSwap(ref a, ref b);
            Console.WriteLine(a.Log() + "," + b.Log());

            pt.MiscMethod("hey", 3, 3.5f, new MyRefType(3));
        }
Esempio n. 3
0
        static void Main16(string[] args)
        {
            #region Define array:多维数组和交错数组
            //使用数组初始化器{}的话, 可以隐式定义
            var array = new[] { 1, 2 };

            //Multi-dimentional array
            //相当于int[,] marray = new int[3, 3] -> [0,0]=1,[0,1]=2,[0,3]=3,[1,0]=1...
            int[,] marray = new int[, ] {
                { 1, 2, 3 }, { 1, 2, 3 }, { 1, 2, 3 }
            };

            //Jagged-array
            int[][] jarray = new int[3][];
            jarray[0] = null;
            jarray[1] = new int[2];
            jarray[2] = new int[3];
            #endregion

            #region Define array: Anonymous type
            var tuple = new { First = "QI", Last = "ZHOU" };
            Console.WriteLine(string.Format("type:{0}, ele1:{1}, ele2:{2}", tuple.GetType(), tuple.First, tuple.Last));

            //匿名类型数组
            //无法显示显出Anonymouse Type这种类型, 因此声明这个数组需要隐士局部变量和隐士数组声明
            var anonyArray = new[] { tuple, new { First = "Jason", Last = "Brown" } };
            Console.WriteLine("type:" + anonyArray.GetType() + ", " + anonyArray[0].Last);
            #endregion

            int[] arr  = { 1, 2, 3 };
            int[] arr2 = new int[3];
            System.Buffer.BlockCopy(arr, 0, arr2, 0, arr.Length * 4);
            Console.WriteLine(arr[1]);

            #region IEnumerable, ICollection, IList
            MyRefType[] mr = new MyRefType[2];
            MyRefType[,] mr2D = new MyRefType[1, 2];
            //没有报错, Array没有实现泛型接口, 但[引用类型]MyRefType自动实现了所有自己类型和基类类型的泛型接口
            ExampleMethod(mr);
            //报错: 只有1D, 0基的数组才会自动去实现泛型接口
            //ExampleMethod(mr2D);
            #endregion

            #region 创建非0基数组
            //从lowerBound和length的元素个数看出, 想要创建的是1维数组
            //lowerBound每个元素代表这一维起始的index值, 可设计为非0
            //length每个元素代表这一维的长度
            Int32[] lowerBound = { -5 };
            Int32[] length     = { 3 };
            Array   a          = Array.CreateInstance(typeof(Int32), length, lowerBound);
            a.SetValue(100, -5);
            a.SetValue(200, -4);
            Console.WriteLine("index " + a.GetLowerBound(0) + " : " + a.GetValue(-5));
            #endregion

            //AccessTest();

            UseInlineArray();
            UseStackalloc();
        }
        //Swap意在改变指针, 而传入引用类型的指针时, 传递的是指针本身的一个副本
        //该副本指向同一个对象, 因此对象内容可以通过副本改变, 而对指针副本的改变不影响原指针
        static void WrongSwap(MyRefType a, MyRefType b)
        {
            //a,b现在是指针的副本, 不影响原指针
            MyRefType t = a;

            a = b;
            b = t;
            //而原指针和原指针副本指向同一个对象, 通过副本可以修改对象内容
            a.idx = 100;
        }
        //使用格式化器
        static void UseFormatterToSerialize()
        {
            MyRefType    s  = new MyRefType(10);
            string       ss = "blalala";
            MemoryStream ms = SerializeToMemory(s, ss);

            //我可以随意使用这个序列化信息
            File.WriteAllBytes("D:\\serialize_result_bytes.qiqiqi", ms.GetBuffer());

            s           = null;
            ss          = string.Empty;
            ms.Position = 0;

            s  = DeserializeFromMemory(ms) as MyRefType;
            ss = DeserializeFromMemory(ms) as string;
            Console.WriteLine(s);
            Console.WriteLine(ss);
        }
        static void Main_Reflection(string[] args)
        {
            //理解AppDomain.AssemblyResolve Event
            AppDomain ad = AppDomain.CurrentDomain;

            ad.AssemblyResolve += ResolveMyAssemblyFailProblem;
            try
            {
                Assembly x = Assembly.Load("invliad identification");
            }
            catch (Exception e)
            {
                Console.WriteLine("Further exceptions are swallowed " + e.Message);
            }

            Assembly asb = Assembly.LoadFrom(@"D:\Projects\VSWorkspace\CLRviaCSharp\TestDll\bin\Debug\TestDll.dll");

            //获得一个assembly中定义的类型
            foreach (Type t in asb.GetExportedTypes())
            {
                Console.WriteLine(t.FullName);
            }

            #region 获得一个Type实例的方法
            //-
            MyRefType mrt = new MyRefType(1);
            Type      t1  = mrt.GetType();
            Console.WriteLine("GetType on obj instance full name: " + t1.FullName);                            //class name with namespace
            Console.WriteLine("GetType on obj instance assembly qualified name: " + t1.AssemblyQualifiedName); //class name with assembly info
            string fullname = t1.FullName;
            string assemblyqualifiedname = t1.AssemblyQualifiedName;
            //-
            Type t2 = Type.GetType("CLRviaCSharp.MyRefType");
            Console.WriteLine("Type class static method: " + t2.FullName);
            //-
            Type t3 = Type.ReflectionOnlyGetType(assemblyqualifiedname, false, false);
            Console.WriteLine("Type class static reflection only: " + t3.FullName);
            //-
            Assembly asbthis = Assembly.GetEntryAssembly();
            Type     t4      = asbthis.GetType(fullname);
            Console.WriteLine("Assembly instance method: " + t4.FullName);
            //- *
            Type earlyType = typeof(MyRefType);
            Console.WriteLine(earlyType.FullName);
            #endregion

            #region 获得了一个Type后, 查看他的信息
            Console.WriteLine("\r\n\r\n");
            Console.WriteLine("Full Name: " + earlyType.FullName);
            Console.WriteLine("Assembly Name: " + earlyType.Assembly.GetName());
            Console.WriteLine("IsAbstract: " + earlyType.IsAbstract);
            Console.WriteLine("BaseType: " + earlyType.BaseType);
            Console.WriteLine("GUID: " + earlyType.GUID);
            Console.WriteLine("IsSealed: " + earlyType.IsSealed);
            Console.WriteLine("Namespace: " + earlyType.Namespace);
            #endregion

            #region 一段列出FCL assembly中所有Exception派生类的程序
            Console.WriteLine(Environment.NewLine);
            Console.Write("Test use of C# query keywords:");
            var v = (from i in (new int[] { 1, 2, 3 })
                     where i >= 2
                     select i
                     ).ToArray <int>();
            Console.WriteLine(v.Length);

            Console.WriteLine(Environment.NewLine);
            LoadFCLAssemblies();
            Func <Type, string> GetFamilyName = null;
            GetFamilyName = t => "-" + t.FullName + (t.BaseType == typeof(System.Object) ? string.Empty : GetFamilyName(t.BaseType)); //这只是一个方法定义的方式, "-"只是用来以后分割名字

            var exceptionTree =                                                                                                       //在()使用C# Query keywords
                                (
                from ab in AppDomain.CurrentDomain.GetAssemblies()                                                                    //loop这个AppDomain的所有assembly, 对于每个assembly
                from ty in ab.GetExportedTypes()                                                                                      //loop这个assembly中所有类型, 对于每个类型
                where ty.IsClass && ty.IsPublic && typeof(Exception).IsAssignableFrom(ty)                                             //如果ty满足这些条件, 执行以下操作
                let itemPre = GetFamilyName(ty).Split('-').Reverse().ToArray()                                                        //字符串变为[]{BaseName,ChildName}
                              let item = String.Join("-", itemPre, 0, itemPre.Length - 1)                                             //字符串变为"BaseName-ChildName"
                                         orderby item
                                         select item                                                                                  //输出item
                                ).ToArray();                                                                                          //所有输出形成一个数组

            Console.WriteLine("All Exception Types: ");
            foreach (string item in exceptionTree)
            {
                string[] names = item.Split('-');  //并不是都显示, 对于每一个结果只显示最子类, 前面查找子类的父类仅仅只是为了决定前面有多少个空格缩进
                Console.WriteLine(new string(' ', 3 * (names.Length - 1)) + names[names.Length - 1]);
            }
            #endregion
        }