善用視覺化偵錯工具改善程式開發效率 文/沈炳宏 ==========程式========= 程式1 class Customer { private string name = "name"; public string Name { get { return name; } set { name = value; } } private string address="address"; public string Address { get { return address; } set { address = value; } } private string email="email"; public string Email { get { return email; } set { email = value; } } private string phone="phone"; public string Phone { get { return phone; } set { phone = value; } } } ==========程式========= ==========程式========= 程式2 [DebuggerDisplay("Customer ( {Name} )")] class Customer { … } ==========程式========= ==========程式========= 程式3 [DebuggerTypeProxy(typeof(ProductProxy))] class Product { private string _attribute1; private string _attribute2; private string _attribute3; private string _attribute4; private string _attribute5; public Product(string attribute1, string attribute2, string attribute3, string attribute4, string attribute5) { _attribute1 = attribute1; _attribute2 = attribute2; _attribute3 = attribute3; _attribute4 = attribute4; _attribute5 = attribute5; } internal class ProductProxy { public ProductProxy(Product product) { _product = product; } public string Product { get { StringBuilder sb = new StringBuilder( _product._attribute1); if (null != _product._attribute2) sb.AppendFormat(", {0}", _product._attribute2); if (null != _product._attribute3) sb.AppendFormat(", {0}", _product._attribute3); if (null != _product._attribute4) sb.AppendFormat(", {0}", _product._attribute4); if (null != _product._attribute5) sb.AppendFormat(", {0}", _product._attribute5); return sb.ToString(); } } private Product _product; } } ==========程式========= ==========程式========= 程式4 class Base64VisualizerObjectSource : VisualizerObjectSource { public override void GetData(object target, System.IO.Stream outgoingData) { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(outgoingData, target); } ==========程式========= ==========程式========= 程式5 程式5 public partial class Base64StringVisualizerForm : Form { private IVisualizerObjectProvider _objectSource; public Base64StringVisualizerForm( IVisualizerObjectProvider objectSource) { _objectSource = objectSource; InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { PopulateForm(); } private void PopulateForm() { BinaryFormatter formatter = new BinaryFormatter(); string base64string = (string) formatter.Deserialize( _objectSource.GetData()); tbBase64.Text = base64string; tbPlainText.Text = base64Decode( base64string); } private string base64Decode(string base64string) { try { UnicodeEncoding encoder = new UnicodeEncoding(); string textString = encoder.GetString( Convert.FromBase64String(base64string)); return textString; } catch (Exception e) { throw new Exception("解碼錯誤", e); } } private string base64Encode(string textString) { try { string base64string = Convert.ToBase64String( ConvertStringToByteArray(textString)); return base64string; } catch (Exception e) { throw new Exception("編碼錯誤", e); } } public static byte[] ConvertStringToByteArray(s tring stringToConvert) { return (new UnicodeEncoding()). GetBytes(stringToConvert); } private void btnCancel_Click(object sender, EventArgs e) { this.Close(); } private void btnOK_Click(object sender, EventArgs e) { string base64string = base64Encode(tbPlainText.Text); _objectSource.ReplaceObject(base64string); this.Close(); } } ==========程式========= ==========程式========= 程式6 [assembly: DebuggerVisualizer(typeof( Base64StringVisualizer.DebuggerSide), typeof(Base64StringVisualizer. Base64VisualizerObjectSource), Target = typeof(string), Description = "Base64 字串視覺化檢視")] namespace Base64StringVisualizer { public class DebuggerSide : DialogDebuggerVisualizer { protected override void Show( IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider) { Base64StringVisualizerForm form = new Base64StringVisualizerForm(objectProvider); windowService.ShowDialog(form); } } } ==========程式========= ==========程式========= 程式7 string s = "RUN!PC"; string base64string = base64Encode(s); VisualizerDevelopmentHost visualizerHost = new VisualizerDevelopmentHost(base64string, typeof(Base64StringVisualizer)); visualizerHost.ShowVisualizer(); ==========程式=========