作者 主題: C#型別的問題...困惑中...  (閱讀 10090 次)

0 會員 與 1 訪客 正在閱讀本文。

clemond

  • 懷疑的國中生
  • **
  • 文章數: 68
    • 檢視個人資料
C#型別的問題...困惑中...
« 於: 2006-12-20 12:26 »
最近在研究如何使用C# 2005向Excel傳輸資料。在學習的過程中常被下列看似型別轉換問題(我不確定)搞的頭痛! 如下面的Code:
代碼: [選擇]

// Start a new workbook in Excel
Excel.Application objExcel = new Excel.Application();

Excel.Workbooks objBooks = (Excel.Workbooks)objExcel.Workbooks;

Excel._Workbook objBook = (Excel._Workbook)(objBooks.Add(Missing.Value);

Excel.Sheets objSheets = (Excel.Sheets)objBook.Worksheets;

Excel._Worksheet objSheet = (Excel._Worksheet)objSheets.get_Item(1);
:
:
:


我不懂的是為什麼會有上述這麼多的( )objxxxxx
不是已經宣告那些objExcel,objBooks,objbook,objsheets,objsheet為特定data type的reference identifier了嗎? 為何還要加上這麼多好像是強迫轉型(explicit type casting)的用法。查了幾本書好像沒講到這方面的觀念...上MSDN網站也不知從何查起,還請學長們指點迷津,謝謝!

洋蔥叔叔

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 830
    • 檢視個人資料
    • 洋蔥叔叔的隨意漫談電腦、網路、.NET、軟體本地化、雜七雜八
C#型別的問題...困惑中...
« 回覆 #1 於: 2006-12-23 23:05 »
沒錯做那些型別轉換只是多此一舉,可以不用轉。

clemond

  • 懷疑的國中生
  • **
  • 文章數: 68
    • 檢視個人資料
C#型別的問題...困惑中...
« 回覆 #2 於: 2006-12-24 11:08 »
小弟自問自答:
上述的確有些轉型是不須要的,不過有些一定要,否則編譯會不過,像:

代碼: [選擇]

objSheet = (Excel.Worksheet)objBook.Worksheets.get_Item(1);


因為objBook.Worksheets.get_Item()方法傳回的是一個object,而變數objSheet的型別為Excel.Worksheet所以必須要有明確的轉型(explicit type cast),否則型別不相容無法編譯過。唉,剛從PHP轉來C Sharp還須要點適應期....

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
C#型別的問題...困惑中...
« 回覆 #3 於: 2006-12-24 12:08 »
如果寫過 c/c++ 的話, 這種用法就很平常,

有時候基本變數型態之間的轉換都會用到這種語法..

clemond

  • 懷疑的國中生
  • **
  • 文章數: 68
    • 檢視個人資料
C#型別的問題...困惑中...
« 回覆 #4 於: 2006-12-25 11:40 »
因為沒有用C/C++寫過專案,難怪對於型別轉換不熟練。現在我又發現動態繫結(Dynamic Binding)的一個問題,提出來和學長們討論。

現在有一個抽象類別Cal(abstract class Cal),裏面有二個類別成員(class members) X,Y,及一抽象方法Answer(),等著子類別實作。後來有四個加、減、乘、除子類別分別實作了Answer()抽象方法,算出X,Y加、減、乘、除的值。

主程式一開始的時候(我用C# )根據上述四個子類別產生四個物件及宣告一個抽象類別Cal的變數myCal:
代碼: [選擇]

CalAdd myCalAdd = new CalAdd();
CalSub myCalSub = new CalSub();
CalMul my Calmul = new CalMul();
CalDiv myCalDiv = new CalDiv();
Cal myCal;


後來根據使用者於表單內點選加、減、乘、除的選項,分別將myCal指向(reference)加、減、乘、除四個物件。如下:
點選加法:myCal = myCalAdd;
點選加法:myCal = myCalSub;
點選加法:myCal = myCalMul;
點選加法:myCal = myCalDiv;

所以看起來myCal是個參照(reference),可以根據使用者的點選指向四個運算物件,就像一隻手拉著四條風箏的線,要玩那一個風箏物件全憑玩家的須求。現在問題是使用者每點選一次,就會產生一條線連到風箏物件;那使用者點100次,不是會有100條線? 到時候編譯器怎麼知道現在是那條線接到那個風箏物件?  問題可能問的很蠢,還請學長們見諒。

洋蔥叔叔

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 830
    • 檢視個人資料
    • 洋蔥叔叔的隨意漫談電腦、網路、.NET、軟體本地化、雜七雜八
C#型別的問題...困惑中...
« 回覆 #5 於: 2006-12-25 22:04 »
不會,當 myCal = myCalAdd; 的時候,myCal 只是一個指到 myCalAdd 物件的指標,然後又做 myCal = myCalSub; 的時候 myCal 變成了一個指到 myCalSub 的指標,原來的指標會消失,不會有所謂的每點一次產生一條線的情況。用 Base Class 來參考 Derived Class 等同該 Derived Class 的變數,只不過編譯時只可以存取 Base Class 的成員。

clemond

  • 懷疑的國中生
  • **
  • 文章數: 68
    • 檢視個人資料
C#型別的問題...困惑中...
« 回覆 #6 於: 2006-12-25 23:14 »
原來不斷用Base Class來指向Derived Class,原先存在的指標會消失,怪不得不會有"多線"的情況。只是下面的說明不是很懂,可以請學長指點到那可以找到參考資料嗎?我買的C Sharp書籍似乎找不到這個觀念。
引述: "Demonbane"
用 Base Class 來參考 Derived Class 等同該 Derived Class 的變數,只不過編譯時只可以存取 Base Class 的成員。

洋蔥叔叔

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 830
    • 檢視個人資料
    • 洋蔥叔叔的隨意漫談電腦、網路、.NET、軟體本地化、雜七雜八
C#型別的問題...困惑中...
« 回覆 #7 於: 2006-12-27 09:57 »
只是說用 Base Class 型別的變數來參考 Derived Class 的話,你當然只可以存取 Derived Class 內 Base Class 的成員,沒什麼特別意思 :-)