《王牌9 优秀程序员之路——C# 开发经验及技巧大汇总》由会员分享,可在线阅读,更多相关《王牌9 优秀程序员之路——C# 开发经验及技巧大汇总(15页珍藏版)》请在金锄头文库上搜索。
1、 优秀程序员之路C#开发经验及技巧大汇总 王牌9 1 1 优秀程序员之路C#开发经验及技巧大汇总 1. 用接口代替类用于参数 接口是诚实的,能做什么不能做什么一目了然,从来没有什么欺瞒。不像类,可能拥有其接口没有定义的方法 或属性,而编程时则有效要避免用到这些方法和属性。在定义方法时,对于我们需要的对象参数,我们需要的只是它这个对象的功能 或作用的说明,而接口洽洽就可以提供这些了。使用接口代替类用于参数,凡是实现这个接口的类都可以用作参数实例,显而易见接 口拥有更大的灵活性。 对于方法的返回值, 如果要求返回的对象具有某个功能, 而这个功能是在接口中声明的,则只需返回接口即可 。 原则是:参数
2、的传入与传出要尽可能提高其抽象性、扩大其涵盖范围。 2. P/Invoke 是什么? 在受控代码与非受控代码进行交互时会产生一个事务(transition) ,这通常发生在使用平台调用服务(Platform Invocation Services),即 P/Invoke 如调用系统的 API 或与 COM 对象打交道,通过 System.Runtime.InteropServices 命名空间,虽然使用 Interop 非常方便,但据估计每次调用事务都要执行 10 到 40 条指令,算起来开销也不少,所以我们要尽量少调用事务,如果非用不可,建议本着一次调用执行多个动作,而不是多次调用每次只执行
3、少量动作的原则。 3. 怎样从一个 form 传递数据到另一个 form? 假设 Form2 的数据要传到 Form1 的 TextBox。 在 Form2: / Define delegate public delegate void SendData(object sender); / Create instance public SendData sendData; 在 Form2 的按钮单击事件或其它事件代码中: if(sendData != null) sendData(txtBoxAtForm2); this.Close(); /关闭 Form2 在 Form1 的弹出 Form2
4、 的代码中: C#从入门到精通 2 2 Form2 form2 = new Form2(); form2.sendData = new Form2.SendData(MyFunction); form2.ShowDialog(); = private void MyFunction(object sender) textBox1.Text = (TextBox)sender).Text; 4. 强制类型转换与 as 类型转换的区别 当类型转换非法时,强制类型转换将抛出一个 System.InvalidCastException 异常,而 as不会抛出异常,它返回一个 null 值。 5. 怎样
5、从 Flash 调用外部程序,如一个 C#编译后生成的.exe? fscommand(exec, 应用程序.exe); 必须把 flash 发布为.exe 必须在 flash 生成的.exe 文件所在目录建一个名为 fscommand 的子目录,并把要调用的可执行程序拷贝到那里。 6使用用 SqlConnection 连接 SQL Server /加入命名空间 using System.Data.SqlClient; /连接数据库 SqlConnection myConnection = new SqlConnection(); myConnection.ConnectionString =
6、user id=sa;password=sinofindb;initial catalog=test;datasource=127.0.0.1;Connect Timeout=30; myConnection.Open(); 7. 十进制数转成十六进制字符串 int num =123; string str = Convert.ToString(num,16); 十六进制字符串转十进制数 string str = 7b; int num = Convert.ToInt32(str,16); 其它进制也是一样,只要把 16 改进 2 或 8 或 10 就可以了. 8. 关于泛型集合 优秀程序员之
7、路C#开发经验及技巧大汇总 王牌9 3 3 用 Array,ArrayList,Dictionary 等存储对象集合,面临的不只是拆装箱性能损耗的问题。从系统架构角度讲, 所有对象对象都应该是强类型的。为了解决这个问题,从.Net2 开始,便有了泛型。看如下代码: public class Mobile private ArrayList friends= new ArrayList();/这里用 ArrayList 便不足取 public void Add (IFriend f) friends.Add(f) private void SayBless() for (int i = 0; i
8、 friends.Count; i+) IFriend f riend=(IFriend )friendsi;/这里拆装时,必须知道其元素的类型是 IFriend friend.Say (); 这一条小技巧的建议便是:使用泛型集合避免显式类型转换。如果您的代码中有显式转换,或者有 as 操作,可 能需要重新考虑一下架构。as 操作符用起来看似优雅,但若用于类型转换不用也罢。 12. 如何取得安装操作系统输入的用户姓名和公司名称: Microsoft.Win32.RegistryKey cmicRegKey=Microsoft.Win32.Registry.CurrentUser.OpenSub
9、Key(Software); cmicRegKey=cmicRegKey.OpenSubKey(Microsoft); cmicRegKey=cmicRegKey.OpenSubKey(MS Setup (ACME); cmicRegKey=cmicRegKey.OpenSubKey(User Info); object cmicCompany = cmicRegKey.GetValue(DefCompany); object cmicUser = cmicRegKey.GetValue(DefName); 13. C#推荐的命名方法。 (1) 避免容易被主观解释的难懂的名称,如方面名 Ana
10、lyzeThis(),或者属性名 xxK8。这样的名称会导致多义性。 (2) 在类属性的名称中包含类名是多余的, 如 Book.BookTitle。 而是应该使用 Book.Title。 (3) 只要合适,在变量名的末尾或开头加计算限定符(Avg、Sum、Min、Max、Index)。 (4) 在变量名中使用互补对,如 min/max、begin/end 和 open/close。 C#从入门到精通 4 4 (5) 布尔变量名应该包含 Is,这意味着 Yes/No 或 True/False 值,如 fileIsFound。 (6) 在命名状态变量时, 避免使用诸如 Flag 的术语。 状态变量
11、不同于布尔变量的地方是它可以具有两个以上的可能值。不是使用 documentFlag,而是使用更具描述性的名称,如 documentFormatType。 (此项只供参考) (7) 即使对于可能仅出现在几个代码行中的生存期很短的变量, 仍然使用有意义的名称。仅对于短循环索引使用单字母变量名,如 i 或 j。 可能的情况下,尽量不要使用原义数字或原义字符串, 如 For i = 1 To 7。 而是使用命名常数, 如 For i = 1 To NUM_DAYS_IN_WEEK 以便于维护和理解。 14. 控件命名规则 命名方法: 控件名简写+英文描述,英文描述首字母大写 主要控件名简写对照表:
12、控件名 简写 控件名 简写 Label lbl TextBox txt Button btn LinkButton lnkbtn ImageButton imgbtn DropDownList ddl ListBox lst DataGrid dg DataList dl CheckBox chk CheckBoxList chkls RadioButton rdo RadioButtonList rdolt Image img Panel pnl Calender cld AdRotator ar Table tbl RequiredFieldValidator rfv CompareVal
13、idator cv RangeValidator rv RegularExpressionValidator rev ValidatorSummary vs CrystalReportViewer rptvew 15. 怎样定制 VC#DataGrid 列标题? DataGridTableStyle dgts = new DataGridTableStyle(); dgts.MappingName = myTable; /myTable 为要载入数据的 DataTable DataGridTextBoxColumn dgcs = new DataGridTextBoxColumn(); dgc
14、s.MappingName = title_id; dgcs.HeaderText = 标题 ID; dgts.GridColumnStyles.Add(dgcs); dataGrid1.TableStyles.Add(dgts); 16. ListView 控件和 DataGridView 控件的比较 优秀程序员之路C#开发经验及技巧大汇总 王牌9 5 5 两者比较起来,似乎 DataGridView 更加适合用于数据表的展示和编辑操作(类似 Read/Write 模式),而 ListView 则如其名更适合于数据的展示(类似 ReadOnly)。另外两个空间的显示风格也有所不同,DataG
15、ridView 的显示风格更加数据规格化,而 ListView 则能够脱离数据规格化的风格显示(例如 Windows 资源管理器右边的文件列表方式);使用上建议使用后绑定的方式填充数据 17. 如何根据年份判断十二生肖 ChineseLunisolarCalendar 类将时间分成多个部分来表示,如分成年、月和日。年按农历计算,而日和月按阳历计算。GetSexagenaryYear 方法计算与指定日期对应的甲子(60 年)循环中的年。语法格式如下: Public virtual Int GetSexagenaryYear(DateTime time) 此方法返回甲子循环中的一个从 1 到 60
16、 的数字, 它与 date 参数对应。 GetTerrestrialBranch方法计算甲子(60 年)循环中指定年份的地支。语法格式如下: Public int GetTerrestriaBranch(int sexagenaryYear) 参数 sexagenaryYear 是一个从 1 到 60 的整数,表示甲子循环中的一年。返回一个从 1到 12 的整数。主要代码如下: Private void button1_Click(object sender,EventArgs e) System.Globalization.ChineseLunisolarCalendar chinseCal
17、eander=new System.Globalization.ChineseLunisolarCalendar(); string TreeYear =”鼠牛虎兔龙蛇马羊猴鸡狗猪”; int intYear=hinseCaleander.GetSexagenaryYear(DateTime.Now); string Tree=TreeYear.Substring(chinseCaleander.GetTerrestrialBranch(int Year)-1,1); MessageBox.Show(“今年是十二生肖”+Tree+”年”,”判断十二生肖”, MessageBoxButtons.
18、OK,MessageBoxIcon.Information); 18. StringBuilder 和 String 的区别? String 虽然是一个引用类型, 但在赋值操作时会产生一个新的对象, 而 StringBuilder 则不会,所以在大量字符串拼接或频繁对某一字符串进行操作时最好使用 StringBuilder,不要使用 String 示例: using System; using System.Collections.Generic; using System.Text; namespace Example22 C#从入门到精通 6 6 class Program static
19、void Main(string args) const int cycle = 100000; long vTickCount = Environment.TickCount; String str = null; for (int i = 0; i cycle; i+) str += i.ToString(); Console.WriteLine (String: 0 MSEL, Environment.TickCount - vTickCount); vTickCount = Environment.TickCount; /看到这个变量名我就生气,奇怪为什么大家都使它呢? :) Stri
20、ngBuilder sb = new StringBuilder(); for (int i = 0; i 安装和部署项目,模板选择安装向导。 (3)连续二个下一步,在选择包括的项目输出步骤打勾主输出来自,连续两个下一步,完成。 (3)生成。 (4)到项目目录下找到 Setup.exe(还有一个.msi 和.ini 文件),执行。 32. Hash table 的使用 Hashtable tHash = new Hashtable(53);/如果哈希表的初始容量是一个素数的话,他的工作效率最高, 可见素数的强大, 它比 Array 好用的多, 主要其键值对的方式很不错, 也叫字典。 33. F
21、orm 对象禁止调整大小 将 FormBorderStyle 属性设置为 FixedSingle; 也可以将最大尺寸和最小尺寸与当前尺寸写成一致的 34. C#中如何实现 VB 中的 chr 和 asc 函数 只要用 Convert 类中的函数进行转换就可以了,如: int n = Convert.ToInt32(a); char c = Convert.ToChar(99); 优秀程序员之路C#开发经验及技巧大汇总 王牌9 11 11 另外,空的 char 值的获得:Convert.ToChar(0) 例如,在设置了一个 textBox 的PasswordChar 属性后,要清除它,就只能这
22、样了: textBox1.PasswordChar = Convert.ToChar(0) ; 35. 根据 GUID 创建对象实例 System.Guid pGuid = new Guid(guid); System.Type ObjectCustorm = Type.GetTypeFromCLSID(pGuid); Object obj = Activator.CreateInstance(ObjectCustorm); 36. Label 放在图片上时,使 Label 透明的方法 picLogo.Controls.Add(lblStatus); lblStatus.BackColor =
23、 Color.Transparent; 37. 避免程序重复运行(即只允许运行一个实例) System.Threading.Mutex appSingleton = new System.Threading.Mutex(false, MyProgInstance_PPP); if(appSingleton.WaitOne(0, false) Application.Run(new FormMain();); Else MessageBox.Show(程序已经运行); 38. vc# winform 中如何让 textBox 接受回车键消息(假没没有按钮的情况下)? Private void t
24、extBox1_KeyPress(objectsender, System.Windows.Forms. KeyPressEventArgs e) if(e.KeyChar != (char)13) return; else /do something; 39. 怎样把数据库表的二个列合并成一个列 Fill 进 DataSet 里? dcChehao = new DataColumn(newColumnName, typeof(string); dcChehao.Expression = columnName1+columnName2; dt.Columns.Add(dcChehao); C#
25、从入门到精通 12 12 Oracle: select col1|col2 from table sql server: select col1+col2 from table 40. 判断文件或文件夹是否存在 使用 System.IO.File,要检查一个文件是否存在非常简单: bool exist = System.IO.File.Exists(fileName); 如果需要判断目录(文件夹)是否存在,可以使用 System.IO.Directory: bool exist = System.IO.Directory.Exists(folderName); 41. IP 与主机名解析 使用
26、 System.Net 可以实现与 Ping 命令行类似的 IP 解析功能, 例如将主机名解析为 IP 或者反过来: private string GetHostNameByIP(string ipAddress) IPHostEntry hostInfo = Dns.GetHostByAddress(ipAddress); return hostInfo.HostName; private string GetIPByHostName(string hostName) System.Net.IPHostEntry hostInfo = Dns.GetHostByName(hostName);
27、 return hostInfo.AddressList0.ToString(); 42. DataGridView 控件斑马线的效果: AlternatingRowsDefaultCellStyle 界面中设置 BackColor 即可实现奇数行的背景色不同,也就是斑马线的效果;使用上建议使用后绑定的方式填充数据 43. 实现双缓冲绘图 this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint,true); this.UpdateStyles(
28、); 还有一种方法,是先建一个 bmp,在该 bmp 上绘制完毕后,最后一次性复制到目标画布上。 43. 当用鼠标滚轮浏览 DataGrid 数据超过一定范围 DataGrid 会失去焦点。怎样解决? this.dataGrid1.MouseWheel+=new 优秀程序员之路C#开发经验及技巧大汇总 王牌9 13 13 MouseEventHandler(dataGrid1_MouseWheel); private void dataGrid1_MouseWheel(object sender, MouseEventArgs e) this.dataGrid1.Select(); 44. 将
29、图片保存到一个 XML 文件 WinForm 的资源文件中,将 PictureBox 的 Image 属性等非文字内容都转变成文本保存,这是通过序列化(Serialization)实现的, 例子: using System.Runtime.Serialization.Formatters.Soap; Stream stream = new FileStream(E:Image.xml,FileMode.Create,FileAccess.Write,FileShare.None); SoapFormatter f = new SoapFormatter(); Image img = Image
30、.FromFile(E:Image.bmp); f.Serialize(stream,img); stream.Close(); 45. 根据 GUID 创建对象实例 System.Guid pGuid = new Guid(guid); System.Type ObjectCustorm = Type.GetTypeFromCLSID(pGuid); Object obj = Activator.CreateInstance(ObjectCustorm); 46. 屏蔽 CTRL-V 在 WinForm 中的 TextBox 控件没有办法屏蔽 CTRL-V 的剪贴板粘贴动作,如果需要一个输入
31、框, 但是不希望用户粘贴剪贴板的内容, 可以改用 RichTextBox 控件, 并且在 KeyDown中屏蔽掉 CTRL-V 键,例子: private void richTextBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) if(e.Control & e.KeyCode=Keys.V) e.Handled = true; 47怎样把 DataGrid 的数据导出到 Excel 以供打印? private void button1_Click(object sender, System.EventArgs
32、e) int row_index, col_index; row_index = 1; C#从入门到精通 14 14 col_index = 1; Excel.ApplicationClass excel = new Excel.ApplicationClass(); excel.Workbooks.Add(true); DataTable dt = ds.Tablestable; foreach(DataColumn dcHeader in dt.Columns) excel.Cellsrow_index, col_index+ = dcHeader.ColumnName; foreach(
33、DataRow dr in dt.Rows) col_index = 0; foreach(DataColumn dc in dt.Columns) excel.Cellsrow_index+1, col_index+1 = drdc; col_index+; row_index+; excel.Visible = true; private void Form1_Load(object sender, System.EventArgs e) SqlConnection conn = new SqlConnection(server=tao; uid=sa; pwd=; database=pu
34、bs); conn.Open(); SqlDataAdapter da = new SqlDataAdapter(select * from authors, conn); ds = new DataSet(); da.Fill(ds, table); dataGrid1.DataSource = ds; dataGrid1.DataMember = table; 48最小化窗口 点击“X”或“Alt+F4”时,最小化窗口。 如: protected override void WndProc(ref Message m) const int WM_SYSCOMMAND = 0x0112; c
35、onst int SC_CLOSE = 0xF060; if (m.Msg = WM_SYSCOMMAND & (int) m.WParam = SC_CLOSE) 优秀程序员之路C#开发经验及技巧大汇总 王牌9 15 15 / User clicked close button this.WindowState = FormWindowState.Minimized; return; base.WndProc(ref m); 49如何获得桌面路径和屏幕分辨率: 桌面路径: Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
36、.ToString 得到屏幕分辨率: System.Windows.Forms.Screen.PrimaryScreen.Bounds 50. 获取某月的实际工作日(即不包括周六日) /int days=getDays(System.DateTime.Now);调用即可获得 private int getDays(System.DateTime date1) int m=System.DateTime.DaysInMonth(date1.Year,date1.Month); int mm=0; for(int i=1;i=m;i+) System.DateTime date=Convert.ToDateTime(date1.Year+-+date1.Month+-+i); switch(date.DayOfWeek) case System.DayOfWeek.Monday: case System.DayOfWeek.Tuessday: case System.DayOfWeek.Wednesday: case System.DayOfWeek.Thursday: case System.DayOfWeek.Friday: mm=mm+1; break; return mm;