-
TIPS-解決ASP.NET日期格式不一致的問題
-
之前曾在介紹.NET DateTime Formatting時,建議過大家DateTime.ToString()最好能指定yyyy-MM-dd等格式,不要依賴Windows本身的國別設定,否則有可能發生換台機器甚至換個User結果就不同的困擾。
但如果網站專案是別人寫好的,硬是用了未指定格式的DateTime.ToString(),在中文版上跑得好好的,移到你的英文版Windows日期格式就出了問題,怎麼辦?
今天就遇到這種情況,跟同事研究出幾種解法:
- 如果只要處理單一Web Application,可以在web.config中加入<globalization culture="zh-TW' />(或需要的國別)
- 想一口氣解決一缸子Web Application的Culture設定,可以從C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\web.config 或 C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\config\machine.config下手,一樣是指定<globalizatoin> culture Attribute即可。
- 喜歡用GUI的人,可以用IIS管理員設定:
最後再提醒一次,ASP.NET不像Windows Form,很少會有配合"Windows環境"自動套用不同Culture的需求,若要配合使用者的偏好使用不同日期格式,也會靠User Profile機制來實現。所以不指定格式的DateTime.ToString()只會徒增部署及管理的困擾,請避免使用。
-
C# 3.0自動實作屬性的犀利之處
-
之前看過不少關於C# 3.0的自動實作屬性(Auto-Implemented Properties)特性介紹,但看過好幾篇文章都是只提了類似以下的例子:
使用前:
private int _length = 0;
public int Length
{ get { return _length; } set { _length = value; }}
使用後:
public int Length { get; set; }
號稱是四行變一行,但我心中一直有個疑惑,要這麼搞,何不直接來個:
更是乾脆痛快,還少打好幾個字。Property比直接宣告公開變數的優勢是可以指定成唯讀或唯寫及加上客製邏輯,若對外完全開放讀寫又不打算加工,何必脫了褲子放屁包成Property?
今天在Coding時,一時興起也想用一下C# 3.0的新功能,而這次的屬性想設成唯讀,就試了以下的寫法:
public int Length { get; }
才寫完自己就覺得不對勁。靠腰! 只有get,那不是連自己的Code也沒法設定它的值? 果然,一Build就得到以下的錯誤
'My.WebControl.MyProp.get' must declare a body because it is not marked abstract or extern. Automatically implemented properties must define both get and set accessors.
get與set要成對出現? 那豈不跟直接宣告公開變數沒兩樣? 不過,用錯誤訊息Google到相關文章,終於了解到它真正的好處。對外唯讀時要寫成這樣:
public int Length { get; private set; }
原來MSDN Libary早有明確的介紹,get, set前只要加上Access Modifier(例如: private, internal, protected...)就可以管控讀寫的範圍,如此便比傳統寫法省事許多,這才是它的犀利之處。只能怪先前運氣不好,看過的幾篇文件都沒點到關鍵,自己又不求甚解,沒認真找答案。
我猜也許會有人跟我一樣,這份心得就跟大家報告一下囉。