c#开发-基础知识及有用技巧(一)

2024-04-10 09:16:29
1、时间长度的计算 TimeSpan类。
   例如:TimeSpan span = dateTime1 - dateTime2   方便啊
2、从类(Class)返回一个System.Type类型,用typeof关键字
3、从一个对象实例(Object)返回一个System.Type类型,用GetType方法
4、判断是否处于设计状态:DesignMode属性
5、根据GUID创建对象实例

System.Guid pGuid=newGuid(guid);
System.Type ObjectCustorm
=Type.GetTypeFromCLSID(pGuid);
Object obj
=Activator.CreateInstance(ObjectCustorm);

6、GDI+不支持xor绘制模式的近似解决方法:
ControlPaint.DrawReversibleFrame、ControlPaint.DrawReversibleLine方法
7、获取Enum类型中的所有枚举值:
  Enum.GetNames方法
 将字符串转换成枚举值
  Enum.Parse方法
8、Label放在图片上时,使Label透明

picLogo.Controls.Add(lblStatus);
lblStatus.BackColor
=Color.Transparent;

9、调用帮助文件
打开帮助文件
Help.ShowHelp(this,@"c:/windows/help/mspaint.chm");

打开帮助文件,并跳转到指定的主题
Help.ShowHelp(this,@"c:/windows/help/mspaint.chm","paint_lines.htm");

打开帮助文件,并转到“索引”选项卡
Help.ShowHelpIndex(this,@"c:/windows/help/mspaint.chm","paint_lines.htm");

在屏幕上显示一条浮动的帮助信息
Help.ShowPopup(this,"这里是帮助信息",new Point(100,100));

10、通过AppDomain在应用程序之间传递数据
例如,两个系统可能会共用登录信息,登录一个系统后,再启动另一个系统时,不需要重新登录。
先定义一个在应用程序之间传递的数据的类,该类必须从MarshalByRefObject继承:

/**////<summary>///用于在不同的appdomain之间传递参数
///</summary>

publicclassAppDomainInfo:MarshalByRefObject
{
publicintUserID;
}

然后可以这样打开新的应用程序

AppDomainSetup setup=newAppDomainSetup();
                    setup.ApplicationName
="测试程序";                    
                    AppDomain appDomain
=AppDomain.CreateDomain("TestDomain",null, setup);

                    AppDomainInfo domainInfo
=newAppDomainInfo();
                    domainInfo.UserID
=Winsharp.BaseClass.AppConfigInfo.UserID;
                    appDomain.SetData(
"domainInfo",domainInfo);

objectobj=appDomain.CreateInstanceFromAndUnwrap(str,"TestDomain.Test");
                    (obj
asForm).Show();

11、换行字符串,相当于"\r\n",Environment.NewLine
       API中有GetTickCount函数,C#中为Environment.TickCount
12、取得安装操作系统输入的用户姓名和公司名称:

  Microsoft.Win32.RegistryKey   cmicRegKey=Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software");   
                   cmicRegKey
=cmicRegKey.OpenSubKey("Microsoft");   
                cmicRegKey
=cmicRegKey.OpenSubKey("MS Setup (ACME)");   
                cmicRegKey
=cmicRegKey.OpenSubKey("User Info");   
objectcmicCompany=cmicRegKey.GetValue("DefCompany");     
objectcmicUser=cmicRegKey.GetValue("DefName");

13、C# WinForm 捕获最小化事件(来自Limon Tea的随笔http://limon7.cnblogs.com/archive/2006/07/23/457865.html)
 虽然Form类没有提供Minimize的事件,但还是可以通过重载Deactive来实现
当Form失去焦点后,测试WindowState取得Form状态,若为Minimized既是最小化事件。
本例为最小化后隐藏窗口:

privatevoidForm1_Deactivate(objectsender, EventArgs e)
{
if(this.WindowState==FormWindowState.Minimized)
this.Visible=false;
        }

还有种方法更加直接,重载WndProc:

constintWM_SYSCOMMAND=0x112;
constintSC_CLOSE=0xF060;
constintSC_MINIMIZE=0xF020;
constintSC_MAXIMIZE=0xF030;
protectedoverridevoidWndProc(refMessage m)
{
if(m.Msg==WM_SYSCOMMAND)
{
if(m.WParam.ToInt32()==SC_MINIMIZE)
{
this.Visible=false;
return;
        }
    }
base.WndProc(refm);
}

14、FromBase64String的问题
   在使用Convert.ToBase64String()对字符串进行Base64编码时,注意的几点:
     例:string s = "Hello";
         byte[] bytes = Convert.FromBase64String(s);
  以上代码在运行时会抛出FormatException异常.提示为:Base-64字符数组的无效长度

原因:当Convert.FromBase64String方法的参数s的长度小于 4 或不是 4 的偶数倍时,将会抛出FormatException。
  
     例:
         Convert.FromBase64String("Hell");      // Normal.
         Convert.FromBase64String("Hell ");     // Normal.(忽略空格)
         Convert.FromBase64String("Hello!");    // throw FormatException.
         Convert.FromBase64String("Hello Net"); // Normal.(忽略空格)

15、避免程序重复运行。(即只允许运行一个实例)

System.Threading.Mutex appSingleton=newSystem.Threading.Mutex(false,"MyProgInstance_PPP");if(appSingleton.WaitOne(0,false)) 
    {
      Application.Run(
newFormMain(););
    }
else{
      MessageBox.Show(
"程序已经运行");
   }

16、VB中的chr和asc函数在C#中没有,C#中只要用Convert类中的函数进行转换就可以了,如:
     int n = Convert.ToInt32('a');
     char c = Convert.ToChar(99);
     另外,空的char值的获得:Convert.ToChar(0) 例如,在设置了一个textBox的PasswordChar属性后,要清除它,就只能这样了:textBox1.PasswordChar = Convert.ToChar(0) ;

17、C#的String.Format举例(http://blog.sina.com.cn/u/4a99b1ba010005ax)

string str1 = String.Format("{0:N1}",56789);              //result: 56,789.0 string str2 = String.Format("{0:N2}",56789);               //result: 56,789.00 string str3 = String.Format("{0:N3}",56789);               //result: 56,789.000
string str8 = String.Format("{0:F1}",56789);               //result: 56789.0
 string str9 = String.Format("{0:F2}",56789);               //result: 56789.00
 string str11 =(56789 / 100.0).ToString("#.##");           //result: 567.89
 string str12 =(56789 / 100).ToString("#.##");              //result: 567

字符 说明 示例 输出

C 或 c

货币

Console.Write("{0:C}", 2.5);

Console.Write("{0:C}", -2.5);

$2.50

($2.50)

D 或 d

十进制数

Console.Write("{0:D5}", 25);

00025

E 或 e

科学型

Console.Write("{0:E}", 250000);

2.500000E+005

F 或 f

固定点

Console.Write("{0:F2}", 25);

Console.Write("{0:F0}", 25);

25.00

25

G 或 g

常规

Console.Write("{0:G}", 2.5);

2.5

N 或 n

数字

Console.Write("{0:N}", 2500000);

2,500,000.00

X 或 x

十六进制

Console.Write("{0:X}", 250);

Console.Write("{0:X}", 0xffff);

FA

FFFF

C#的String.Format举例

string str1 = String.Format("{0:N1}",56789);              //result: 56,789.0 string str2 = String.Format("{0:N2}",56789);               //result: 56,789.00 string str3 = String.Format("{0:N3}",56789);               //result: 56,789.000
string str8 = String.Format("{0:F1}",56789);               //result: 56789.0
 string str9 = String.Format("{0:F2}",56789);               //result: 56789.00
 string str11 =(56789 / 100.0).ToString("#.##");           //result: 567.89
 string str12 =(56789 / 100).ToString("#.##");              //result: 567

字符 说明 示例 输出

C 或 c

货币

Console.Write("{0:C}", 2.5);

Console.Write("{0:C}", -2.5);

$2.50

($2.50)

D 或 d

十进制数

Console.Write("{0:D5}", 25);

00025

E 或 e

科学型

Console.Write("{0:E}", 250000);

2.500000E+005

F 或 f

固定点

Console.Write("{0:F2}", 25);

Console.Write("{0:F0}", 25);

25.00

25

G 或 g

常规

Console.Write("{0:G}", 2.5);

2.5

N 或 n

数字

Console.Write("{0:N}", 2500000);

2,500,000.00

X 或 x

十六进制

Console.Write("{0:X}", 250);

Console.Write("{0:X}", 0xffff);

FA

FFFF

18、bytes[]和int的相互转换

ints=100;   
byte[]   shi=System.BitConverter.GetBytes(s);         
intsh=System.BitConverter.ToInt32(shi,0);

19、BitArray和int的相互转换

int[]   a=newint[1];   
  a[
0]=100;   
int[]   b=newint[1];   
    
  System.Collections.BitArray   shit
=newBitArray(a);   
  shit.CopyTo(b,
0);

20、随机数:
1) System.Random
2) xdev所提到的System.Security.Cryptography.RNGCryptoServiceProvider
3) 直接调用Platform SDK中的CryptGenRandom()函数。
其中,和1)相比,2)和3)可以被作为真正的随机数来使用。

21、最简单的实现双缓冲绘图:
this.SetStyle(ControlStyles.DoubleBuffer |
      ControlStyles.UserPaint |
      ControlStyles.AllPaintingInWmPaint,
      true);
   this.UpdateStyles();

还有一种方法,是先建一个bmp,在该bmp上绘制完毕后,最后一次性复制到目标画布上。但在实际使用中,我发现该方法有时反倒闪烁得厉害,不知是为什么,郁闷~

22、取得局域网内本机IP地址
String name = Dns.GetHostName();
IPHostEntry ips = Dns.GetHostByName(name);
return ips.AddressList[0].ToString();

23、取得局域网广播地址
IPv4广播地址的定义是网络号码与网络掩码逻辑“非”之间的逻辑“或”。
    例如一个地址为:197.8.43.211,其子网掩码为255.255.255.240则其网络号码为两者的二进制逻辑"与",即197.8.43.208 网络掩码的逻辑"非"为0.0.0.15,与网络号码197.8.43.208二进制逻辑"或"的结果为197.8.43.223,即该子网的广播地址.

24、Asp.net直接下载文件

FileStream fileStream=newFileStream(pFileName,FileMode.Open)longfileSize=fileStream.Length; 
Context.Response.ContentType
="application/octet-stream"
Context.Response.AddHeader(
"Content-Disposition","attachment; filename=\""+ fileName +"\";"); 
Context.Response.AddHeader(
"Content-Length",fileSize.ToString());byte[] fileBuffer=newbyte[fileSize]; 
fileStream.Read(fileBuffer,
0, (int)fileSize); 
Context.Response.BinaryWrite(fileBuffer); 
Context.Response.End();

25、十进制数转成十六进制字符串
int num =123;
string str = Convert.ToString(num,16);
十六进制字符串转十进制数
string str = "7b";
int num = Convert.ToInt32(str,16);

其它进制也是一样,只要把16改进2或8或10就可以了.

26、在网页上实现html编辑的最简单代码(来自微软网站)

<html><head><title>DHTML 编辑控件代理示例</title><scripttype="text/javascript">functionFillEditor() {vardoc=editor.document;
    doc.designMode
="on";
    doc.write(
"<body><p><i>可视化</i> <u>安静</u></p></body>");
    doc.close();
}
</script></head><bodyonload="FillEditor()"><iframeid="editor"scrolling="yes"height="100"width="300"></iframe><p><inputtype=buttonvalue="Submit"onclick=
       "alert(editor.document.getElementsByTagName('HTML')[0].outerHTML)"
></body></html>

此页面显示了包括格式化 HTML 的可编辑区域。您可在此区域中输入内容,也可使用热键,如 CTRL+I 切换斜体,CTRL+U 切换下划线。当按下 Submit 按钮时,出现一个消息框,显示 <iframe> 元素的 HTML 内容。要等效地实现 DHTML 编辑控件的属性、方法和事件,必须要使用脚本。

出于安全考虑,只有来自相同域的内容才可跨过 <iframe> 界限进行访问。要确保框架的内容可被访问,必须使用 src 属性,从同一域的 URL 中对其进行初始化,正如下列示例所示:

<iframe id="editor"
scrolling="yes"
height="100"
width="300"
src="templates/blank.htm">
</iframe>

有关在 Internet Explorer 中使用 designMode 属性进行编辑的详细信息,请参阅 Microsoft 网站上的 Introduction to MSHTML Editing(英文)页面。

27、强制类型转换与as类型转换的区别
      当类型转换非法时,强制类型转换将抛出一个System.InvalidCastException异常,而as不会抛出异常,它返回一个null值。

28、FromBase64String(string s)函数,对s有如下要求,否则会报错“Base-64字符中的无效字符”:
         s   由基   64   数字、空白字符和尾随填充字符组成。从零开始以升序排列的以   64   为基的数字为大写字符“A”到“Z”、小写字符“a”到“z”、数字“0”到“9”以及符号“+”和“/”。   空白字符为   Tab、空格、回车和换行。s   中可以出现任意数目的空白字符,因为所有空白字符都将被忽略。  无值字符“=”用于尾部的空白。s   的末尾可以包含零个、一个或两个填充字符。

29、这一条不是C#的,是数据库的,有用,收藏一下~
几个删除重复记录的sql语句
(1)用rowid方法据据oracle带的rowid属性,进行判断,是否存在重复,语句如下:
查数据:
    select * from table1 a where rowid !=(select  max(rowid) 
    from table1 b where a.name1=b.name1 and a.name2=b.name2......)
删数据:
   delete  from table1 a where rowid !=(select  max(rowid) 
    from table1 b where a.name1=b.name1 and a.name2=b.name2......)
(2)group by方法
查数据:
  select count(num), max(name) from student --列出重复的记录数,并列出他的name属性
  group by num
  having count(num) >1 --按num分组后找出表中num列重复,即出现次数大于一次
删数据:
  delete from student
  group by num
  having count(num) >1
  这样的话就把所有重复的都删除了。
(3)用distinct方法 -对于小的表比较有用
create table table_new as  select distinct *  from table1 minux
truncate table table1;
insert into table1 select * from table_new;

随时补充吧

c#开发-基础知识及有用技巧(一)相关推荐

  1. iOS开发基础知识--碎片44

    iOS开发基础知识--碎片44  iOS开发基础知识--碎片44 1:App跳转至系统Settings 跳转在IOS8以上跟以下是有区别的,如果是IOS8以上可以如下设置: NSURL *url = ...

  2. IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列

    1.引言 消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一. 消息从发送者到接收者的典型传递方式有两种: 1)一种我 ...

  3. IM开发基础知识补课(三):快速理解服务端数据库读写分离原理及实践建议

    1.前言 IM应用从服务端数据的角度来看,它是一种很特殊的应用场景,抛开基础数据.增值业务和附属功能不谈,单从IM聊天工具的立身之本--聊天数据来说,理论上是不需要在服务端存储的(或者说只需要短暂存储 ...

  4. IM开发基础知识补课(一):正确理解前置HTTP SSO单点登陆接口的原理

    1.前言 一个安全的信息系统,合法身份检查是必须环节.尤其IM这种以"人"为中心的社交体系,身份认证更是必不可少. 一些PC时代小型IM系统中,身份认证可能直接做到长连接中(也就是 ...

  5. IM开发基础知识补课:正确理解前置HTTP SSO单点登陆接口的原理

    1.前言 一个安全的信息系统,合法身份检查是必须环节.尤其IM这种以"人"为中心的社交体系,身份认证更是必不可少. 一些PC时代小型IM系统中,身份认证可能直接做到长连接中(也就是 ...

  6. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之LED模板驱动程序的改造:设备树

    文章目录 前言 1.驱动的三种编写方法 2.怎么使用设备树写驱动程序 2.1.设备树节点要与platform_driver能匹配 2.2.修改platform_driver的源码 3.实验和调试技巧 ...

  7. 【嵌入式Linux】嵌入式Linux应用开发基础知识之串口应用编程

    文章目录 前言 1.ARM芯片是如何使用串口发送/接收数据的 2. TTY体系中设备节点的差别 做个小实验 3.TTY驱动程序框架 4.在STM32MP157上做串口实验的准备工作 4.1.使能设备树 ...

  8. 【嵌入式Linux】嵌入式Linux应用开发基础知识之输入系统应用编程

    文章目录 前言 1.输入系统应用编程 1.1.输入系统框架及调试 1.1.1.框架概述 1.1.2.编写APP需要的基础知识 1.2.调试技巧 1.2.1.查看设备信息 1.2.2.使用命令查看节点数 ...

  9. 【嵌入式Linux】嵌入式Linux应用开发基础知识之文件IO

    文章目录 前言 1.文件从哪来 2.文件如何访问 2.1.通用IO模型open/read/write/lseek/close 2.1.1.通用IO模型使用示例 2.1.2.open/read/writ ...

最新文章

  1. iOS UIView快速添加事件
  2. java 获取init参数,Java如何读取servlet init参数?
  3. 自定义request_python3下urllib.request库之Handle处理器和自定义Opener
  4. 编译cegcc 0.59.1
  5. Windows消息机制详解-5
  6. 面试必问系列之在浏览器中输入URL后到网页显示 其间发生了什么?
  7. 性别有什么用_为啥不让男孩玩布娃娃?别让你的“性别偏见”,给孩子的人生设限...
  8. 前端文件path路由:基于base引用
  9. python 伪多线程_从伪并行的 Python 多线程说起
  10. 三星或将80%手机生产转至越南
  11. 一台显示器分成双屏_双屏办公,用起来到底有多爽
  12. 数据包络分析——二阶段网络带feedback
  13. 通过爬虫爬取一些图片
  14. android 计步器 计算当前的行走步数
  15. 全球上线!ABB中国涡轮增压器分拆 – 数据清理阶段完成
  16. 黑人是晒黑的吗_当您是互联网上的黑人时,无处可逃
  17. java代码编写的文本特征提取_文本特征词提取算法
  18. 包装类中Integer类最全详解
  19. 软件测试能干多久?测试员能干到多大年龄?
  20. 2021-06-13早龙广告视频脚本 ——《世间不过是一顿早餐》

热门文章

  1. 表格过滤器_不用记账软件也可以记录支出明细,这个在线协同表格很方便
  2. php封装公共方法,TP框架下封装公共函数详解
  3. python 清屏_Python学前准备如果你知道要去哪,那么全世界都给你让路
  4. Git使用命令行回退版本git reset --hard
  5. 后端技术:Web安全常见漏洞和修复建议,值得收藏!
  6. MAC电脑常用效率工具推荐
  7. 盘点15个不起眼但非常强大的 Vim 命令
  8. java记事本复制粘贴_Java Swing 如何实现记事本中“编辑”菜单下的 剪切,复制,粘贴,删除,全选 功能...
  9. Java里try catch的简单用法
  10. 综合时如何插入scan_三综合环境试验箱维修时如何做出正确判断?