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)); }
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 }