Feeds:
文章
留言

Archive for 六月 6th, 2006

天啊 const 的陷阱

 
先來看一下 MSDN 上對於 const 的說明
"const 關鍵字是用來修改欄位或區域變數的宣告。它所指定之欄位或區域變數的值是常數,也就是無法修改。常數宣告的型別指定由宣告引入的成員型別。常數運算式必須產生目標型別或可以隱含轉換成目標型別之型別的值。
常數運算式是可以在編譯時期完整評估的運算式。因此,參考型別唯一常數值可能是 string 或 null。"
 
另外 const 和 readonly 差異的說明
 
"readonly 關鍵字不同於 const 關鍵字。const 欄位僅可以在該欄位宣告時初始化。readonly 欄位則是可以在宣告或是在建構函式中初始化。因此,readonly 欄位會根據使用的建構函式而產生不同值。另外,const 欄位是編譯時期常數,而 readonly 欄位則可當做執行階段常數使用"
 
基本上對於 const 關鍵字的使用,我是直接沿用 C++ 的觀念,可是今天看了Jeffrey Richer[2]的才驚覺 const 缺乏跨模組能力,書中的範例很清楚的指出這個問題,程式碼類似如下
/**
 * csc /target:library /out:ConstLib.dll ConstLib.cs
 **/
using System;
namespace Lib{
 public class ConstLib{
  public const int ConstField = 50;
 }
}
/**
 * csc /r:ConstLib.dll program.cs
 **/
using System;
using Lib;
namespace ChuiWenChiu{
 public class program{
  public static void Main(){
   Console.WriteLine( ConstLib.ConstField );
  }
 }
}
如果先建立 ConstLib.dll ,然後在 program.cs 中使用 ConstLib.dll,你會發現一如預期輸出 50。可是如果現在要將 ConstLib 升級,將 ConstField 改為 100,然後重新編譯 ConstLib.dll 再執行 program.exe,這個可就不如我的預期了,我預期應該是 100 可是實際上輸出依然是 50。天啊~ Why?
Jeffrey Richer [2]談到編譯器會將常數的值儲存在 Module 的 Metadata 中,當使用這個常數的時候,編譯器會在定義該常數的 Module 中尋找 Metadata 並取值。所以該常數值是在編譯階段決定,而非執行階段決定,所以,ConstLib.dll 升級 program.exe 並不會受影響。除非重新編譯 program.exe 才會輸出 100。
所以,如果想要模組升級,而不需重新編譯 program.exe 可以將 const 改用 readonly,如下:
/**
 * csc /target:library /out:ReadonlyLib.dll ReadonlyLib.cs
 **/
using System;
namespace Lib{
 public class ReadonlyLib{
  public static readonly int ReadonlyField = 100;
 }
}
/**
 * csc /r:ReadonlyLib.dll program.cs
 **/
using System;
using Lib;
namespace ChuiWenChiu{
 public class program{
  public static void Main(){   
   Console.WriteLine( ReadonlyLib.ReadonlyField );
  }
 }
}
參考資料:
[1] ms-help://MS.MSDNQTR.v80.cht/MS.MSDN.v80/MS.VisualStudio.v80.cht/dv_csref/html/79eb447c-117b-4418-933f-97c50aa472db.htm
[2] Jeffrey Richer, Francesco Balena, "Microsoft .Net Framework 程式設計使用 Visual Basic.Net", Wintellect

補充:const 與 readonly 比較
const
1. compile-time 常數
2. 效能較佳
3. 較無彈性,不太適合將常數存再另外一個 Assembly
4. 無法使用 new 初始化一個物件,且只能用於數值(number)和字串(string)型別
readonly
1. runtime 常數
2. 效能遜於 const
3. 彈性較佳,每次建構時可以擁有不同的常數
4. 可用於任何型別

 

Effective C#, Item2 Prefer readonly to const 筆記

2006/06/14

 

Read Full Post »

[轉貼] 豬排VS績效

摘自電子郵件,如有侵犯您的著作權請通知我,謝謝

  話說….
 在一個農莊裡有一隻豬,擁有多項技能,
 牠會一大早學公雞叫主人起床;
 牠會學貓去抓偷吃起士的老鼠;
 牠會學牧羊犬去管理羊群….
 其他動物問牠幹嘛這麼雞婆,牠說:
 "你們這些笨蛋!在現在這個社會,沒有多項技能怎麼可以生存!況且我這些技能還有證
 哦!"  (  可不是 CAS 喔!!!  )
 可是有一天,主人還是把豬抓起來,準備宰了牠.
 豬不可置信的問:
 "我會這麼多技能,又幫你做那麼多事,為什麼你還是要殺了我?"
 主人淡淡地回答:"沒什麼!我只是想吃豬肋排……."
 
 (績效在於老板認為你該做什麼, 而不是你會做什麼)


最後一句說的太好的,對於基層員工來說,反正你做的再多給的再多,不是他要的他都覺得是 garbage
所以,先弄清楚他要什麼再努力吧,否則只是徒勞無功白忙一場…
反觀如果是主管,是否應該明確讓部屬了解目標是什麼,否則他一定會越來越無力,最後可能導致出走,我想這就是公司或團隊的損失。

Read Full Post »