程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 由C++轉向C#需要注意的變化(六)

由C++轉向C#需要注意的變化(六)

編輯:C#入門知識

引言:每隔10年左右,編程人員就需要花費大量的時間和精力去學習新的編程技術。在80年代是Unix和C,90年代是Windows和C++,現在又輪到了微軟的.NETFramework和C#。盡管需要學習新的技術,但由此帶來的好處卻遠高於付出的勞動。幸運的是,使用C#和.NET進行的大多數工程的分析和設計與在C++和Windows中沒有本質的變化。在本篇文章中,我將介紹如何實現由C++到C#的飛躍。

  已經有許多文章介紹過C#對C++的改進,在這裡我就不再重復這些問題了。在這裡,我將重點討論由C++轉向C#時最大的變化:由不可管理的環境向可管理的環境的變化。此外,我還會提出一些C#編程人員容易犯的錯誤供大家參考,此外,還將說明一些C#語言的能夠影響編程的新功能。

  系列文章:[由C++轉向C#需要注意的變化(一)(二)(三)(四)(五)]

  只發現方法

  我們可能會只關心方法,而不關心域、屬性等,為此,我們需要刪除如下的對GetMembers的調用:


   MemberInfo[]mbrInfoArray=
  theType.GetMembers(BindingFlags.LookupAll); 


  然後添加調用GetMethods的語句:


   mbrInfoArray=theType.GetMethods(); 


  現在,輸出中就只剩下方法了。


   Output(excerpt)
  BooleanEquals(System.Object)isaMethod
  System.StringToString()isaMethod
  System.StringCreateQualifiedName(System.String,System.String)
  isaMethod
  System.Reflection.MethodInfoget_EntryPoint()isaMethod 


  發現特定的成員
  最後,為了進一步地縮小范圍,我們可以使用FindMembers方法來發現某一類型的特定的方法。例如,在下面的代碼中,我們可以只搜索以“Get”開頭的方法。


   publicclassTester
  {
  publicstaticvoidMain()
  {
  //檢查一個單一的對象
  TypetheType=Type.GetType("System.Reflection.Assembly");
  //只獲取以Get開頭的成員
  MemberInfo[]mbrInfoArray
  theType.FindMembers(MemberTypes.Method,
  BindingFlags.Default,
  Type.FilterName,"Get*");
  foreach(MemberInfombrInfoinmbrInfoArray)
  {

  Console.WriteLine("{0}isa{1}",
  mbrInfo,mbrInfo.MemberType.Format());
  }
  }
  }


  其輸出的一部分如下所示:


   System.Type[]GetTypes()isaMethod
  System.Type[]GetExportedTypes()isaMethod
  System.TypeGetType(System.String,Boolean)isaMethod
  System.TypeGetType(System.String)isaMethod
  System.Reflection.AssemblyNameGetName(Boolean)isaMethod
  System.Reflection.AssemblyNameGetName()isaMethod
  Int32GetHashCode()isaMethod
  System.Reflection.AssemblyGetAssembly(System.Type)isaMethod
  System.TypeGetType(System.String,Boolean,Boolean)isaMethod 


  動態調用

  一旦發現一個方法,可以使用映射的方法調用它。例如,我們可能需要調用System.Math中的Cos方法(返回一個角的余弦值)。為此,我們需要獲得System.Math類的類型信息,如下所示:


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


  有了類型信息,我們就可以動態地加載一個類的實例:


   ObjecttheObj=Activator.CreateInstance(theMathType); 


  CreateInstance是Activator類的一個靜態方法,可以用來對對象進行初始化。

  有了System.Math類的實例後,我們就可以調用Cos方法了。我們還需要准備好一個定義參數類型的數組,因為Cos只需要一個參數(需要求余弦值的角度),因此數組中只需要有一個成員。我們將在數組中賦予一個System.Double類型的Type對象,也就是Cos方法需要的參數的類型:


   Type[]paramTypes=newType[1];
  paramTypes[0]=Type.GetType("System.Double"); 


  現在我們就可以傳遞方法的名字了,這個數組定義了Type對象中GetMethod方法的參數的類型:


   MethodInfoCosineInfo=
  theMathType.GetMethod("Cos",paramTypes); 


  我們現在得到了MethodInfo類型的對象,我們可以在其上調用相應的方法。為此,我們需要再次在數組中傳入參數的實際值:


   Object[]parameters=newObject[1];
  parameters[0]=45;
  ObjectreturnVal=CosineInfo.Invoke(theObj,parameters); 


  需要注意的是,我創建了二個數組,第一個名字為paramTypes的數組存儲著參數的類型,第二個名字為parameters的數組保存實際的參數值。如果方法需要二個參數,我們就需要使這二個數組每個保持二個參數。如果方法不需要參數,我們仍然需要創建這二個數組,只是無需在裡面存儲數據即可。


   Type[]paramTypes=newType[0]; 


  盡管看起來有點奇怪,但它是正確的。下面是完整的代碼:

  映射方法的使用


   usingSystem;
  usingSystem.Reflection;publicclassTester
  {
  publicstaticvoidMain()
  {
  TypetheMathType=Type.GetType("System.Math");
  ObjecttheObj=Activator.CreateInstance(theMathType);
  //只有一個成員的數組
  Type[]paramTypes=newType[1];
  paramTypes[0]=Type.GetType("System.Double");

  //獲得Cos()方法的信息
  MethodInfoCosineInfo=
  theMathType.GetMethod("Cos",paramTypes);

  //將實際的參數填寫在一個數組中
  Object[]parameters=newObject[1];
  parameters[0]=45;
  ObjectreturnVal=CosineInfo.Invoke(theObj,parameters);
  Console.WriteLine(
  "Thecosineofa45degreeangle{0}",returnVal);

  }
  }
 


  結論

  盡管有許多小錯誤等著C++編程人員去犯,但C#的語法與C++並沒有太大的不同,向新語言的轉換是相當容易的。使用C#的有趣的部分是使用通用語言運行庫,這篇文章只能涉及幾個重點問題。CLR和.NETFramework提供了對線程、集合、互聯網應用開發、基於Windows的應用開發等方面提供了更多的支持。語言功能和CLR功能之間的區分是非常模糊的,但組合在一起就是一種功能非常強大的開發工具了。


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved