C#笔记.docx
- 文档编号:26891469
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:51
- 大小:2.53MB
C#笔记.docx
《C#笔记.docx》由会员分享,可在线阅读,更多相关《C#笔记.docx(51页珍藏版)》请在冰豆网上搜索。
C#笔记
*2,8,10,16进制输出
说明:
Convert.ToString方法(Int16,IFormatProvider)
用法:
stringvalueString=Convert.ToString(value,radix);
//value整数值,
//radix为2,8,10,16分别代表进制。
例:
inti=8;
stringStr_Value=Convert.ToString(8,2)
‘\r’,’\n\r’和’\n’的区别
'\r'回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖;
'\n'换行,换到当前位置的下一行,而不会回到行首;
‘\n\r’换行,并回到行首
*Console.WriteLine()是格式化输出时用
String类下有一个Format方法,该方法是格式化字符串的
在以上两种格式化方式中,都需要用到占位符和参数列表
例:
<1>Console.WriteLine("{0},{1}",name,score.ToString());
<2>Strings=String.Format("{0},{1}",name,score.ToString());
Console.WriteLine(s);
以上<1>和<2>效果是相同的
*例子privateMyClass():
this("DefaultName")
{
}
publicMyClass(stringnewName)
{
Name=newName;
intVal=0;
}
解释:
在你这个程序中,有两个构造函数,下面那个带参数的就不用多说了,上面那个私有的构造函数不带参数,但是调用它时会自动执行本类中的另一个构造函数(这是由于后面的this的作用),具体调用哪一个构造函数取决于this中带有几个参数,用this中的参数来匹配最合适的那个构造函数,本例中就是带一个字符串的那个构造函数。
具体应用你可以查一下this的作用,另外还有一个base,用来调用父类中的构造函数。
带有this或base的构造函数在执行之前,会首先调用同类中或父类中的其他构造函数,当这些构造函数执行完之后,再执行该构造函数,所有的构造函数默认都有一个base(),也就是执行父类的默认构造函数,一直追溯到object类,这就是一个对象的构造过程
*如何打开文件
privatevoidToolStripMenuItem_Click(objectsender,EventArgse)
{
openFileDialog1.InitialDirectory="D:
\\资料\\固高\\VB版\\mct2008";
openFileDialog1.Filter="文本文件(*.CHM)|*.CHM";
if(openFileDialog1.ShowDialog()==DialogResult.OK)
{
System.Diagnostics.Process.Start(openFileDialog1.FileName);
}
}
**分部类:
可以将类或结构、接口或方法的定义拆分到两个或多个源文件中。
每个源文件包含类型或方法定义的一部分,编译应用程序时将把所有部分组合起来。
处理大型项目时,使一个类分布于多个独立文件中可以让多位程序员同时对该类进行处理。
使用自动生成的源时,无需重新创建源文件便可将代码添加到类中。
VisualStudio在创建Windows窗体、Web服务包装代码等时都使用此方法。
无需修改VisualStudio创建的文件,就可创建使用这些类的代码。
若要拆分类定义,请使用partial关键字修饰符。
**特性
放在类前修饰类的[SomeClass(Params)]是自定义属性类,通常称作是特性类,作用就是给类添加一些额外的特性,比如:
[Serializable]
classmyClass
{
publicinta{get;set;}
publicstringb{get;set;}
}
这里a、b都是myClass的属性,加一行[Serializable],这就是特性,表示myClass类可以被序列化,这时myClass的一个实例就能被序列化保存到本地磁盘或database中,不加的话就没有这个特性了。
*Application:
提供static方法和属性以管理应用程序,例如启动和停止应用程序、处理Windows消息的方法和获取应用程序信息的属性。
此类不能被继承。
**fill(ds,"t");解释:
da是适配器的对象
da.fill通过适配器的对象da来调用方法fill,最终通过该方法将数据填充到数据集。
fill(参数1,参数2)
参数1:
就是数据集DataSet的对象,你这里对象就是ds,而t就是要为添加进去的数据(这里的数据你可以看做是一张表)起个名字。
也就是说为表起个表名。
因为数据集是一个集合,里面可以放很多个对象(也就是说可以放很多张表),起名字的作用是方便识别,可以直接通过名字找到该表。
如果你不起名字,那么只有通过索引来查找了,这样效率就不高了。
**dataGridView1.DataSource=ds.Tables[0];解释:
SqlConnectioncnn=newSqlConnection();//实例化一个连接
cnn.ConnectionString="DataSource=datasource;uid=username;pwd=password;database=database_name";//设置连接字符串
cnn.Open();//打开数据库连接
2.让查询在datagridview中显示
SqlDataAdapterda=newSqlDataAdapter();//实例化sqldataadpter
SqlCommandcmd1=newSqlCommand("select*from表,cnn);//sql语句
da.SelectCommand=cmd1;//设置为已实例化SqlDataAdapter的查询命令
DataSetds1=newDataSet();//实例化dataset
da.Fill(ds1);//把数据填充到dataset
datagridview1.datasource=ds1.tables[0];//将数据集绑定datagridview,完成显示
说明:
dataset是一个数据库在内存中的映像,包括数据库中的表,视图,关系等;sqldataadapter是C#的数据库适配器,需要通过它来查询数据库,要通过SqlDataAdapter.SelectCommand来设置查询语句,查询后填充到dataset中,再把dataset和datagridview绑定就好了,以上代码写在button事件中就可以。
**文件选择控件——openFileDialog:
//设置打开类型的文件
openFileDialog1.Filter="文本文件|*.txt|所有文件|*.*";
//显示
DialogResultdr=openFileDialog1.ShowDialog();
//取值
if(dr==DialogResult.OK)
{
label3.Text=openFileDialog1.FileName;
}
**字体样式选择控件——FontDialog:
fontDialog1.ShowDialog();
//选用字体样式改变label1字体样式
label1.Font=fontDialog1.Font;
**颜色选择控件——ColorDialog
colorDialog1.ShowDialog();
//把取到的颜色赋值给panel
label1.BackColor=colorDialog1.Color;
**File类和FileInfo类有什么区别
如果用户正试图对文件进行几种操作,可以使用FileInfo类。
FileInfo类不包含静态的方法;因此,该类具有不同的用法。
使用FileInfo类而不使用File类的原因在于,当创建一个FileInfo类,系统在第一次使用文件的时候要进行安全检查,而File类却在每次使用该方法的时候对文件进行一次安全检查。
这是因为File类只有静态的方法,该方法无法确知对同一文件的多次访问。
FileInfo类包含File类所有的功能,并且更多。
但是因为FileInfo类的应用范围为一个指定的文件,因此在语法上略有不同。
**FileStream对象表示在磁盘或网络路径上指向文件的流。
这个类提供了在文件中读写字节的方法,但经常使用StreamReader或StreamWriter执行这些功能。
这是因为FileStream类操作的是字节和字节数组,而Stream类操作的是字符数据。
***静态成员:
静态成员无法实例化,访问静态成员必须使用类名+.访问
**对象初始化语句:
**索引
委托:
声明委托委托时,签名中的类型可以是自己定义的类
例:
delegatevoidVlidationDelegate(VlidationEventArgse)
类库:
类库中只有public方法,属性,字段可以被其他类调用
#region(C#参考)
#region 使您可以在使用VisualStudio代码编辑器的 大纲显示功能时指定可展开或折叠的代码块。
在较长的代码文件中,能够折叠或隐藏一个或多个区域会十分便利,这样,您可将精力集中于当前处理的文件部分。
下面的示例演示如何定义区域:
#regionMyClassdefinition
publicclassMyClass
{
staticvoidMain()
{
}
}
#endregion
using关键字有两个主要用途:
(一).作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型。
(二).作为语句,用于定义一个范围,在此范围的末尾将释放对象。
using语句作为语句允许程序员指定使用资源的对象应当何时释放资源。
using语句中使用的对象必须实现IDisposable接口。
此接口提供了Dispose方法,该方法将释放此对象的资源。
①可以在using语句之前声明对象。
Fontfont2=newFont("Arial",10.0f);
using(font2)
{
//usefont2
}
②可以在using语句之中声明对象。
using(Fontfont2=newFont("Arial",10.0f))
{
//usefont2
}
③可以有多个对象与using语句一起使用,但是必须在using语句内部声明这些对象。
using(Fontfont3=newFont("Arial",10.0f),font4=newFont("Arial",10.0f))
{
//Usefont3andfont4.
}
使用规则
①using只能用于实现了IDisposable接口的类型,禁止为不支持IDisposable接口的类型使用using语句,否则会出现编译错误;
②using语句适用于清理单个非托管资源的情况,而多个非托管对象的清理最好以try-finnaly来实现,因为嵌套的using语句可能存在隐藏的Bug。
内层using块引发异常时,将不能释放外层using块的对象资源;
③using语句支持初始化多个变量,但前提是这些变量的类型必须相同,例如:
using(Penp1=newPen(Brushes.Black),p2=newPen(Brushes.Blue))
{
//
}
④针对初始化多个不同类型的变量时,可以都声明为IDisposable类型,例如:
using(IDisposablefont=newFont("Verdana",12),pen=newPen(Brushes.Black))
{
floatsize=(fontasFont).Size;
Brushbrush=(penasPen).Brush;
}
var关键字
var关键字是C#3.0开始新增的特性,称为推断类型,可以赋予局部变量推断“类型”var而不是显式类型。
var关键字指示编译器根据初始化语句右侧的表达式推断变量的类型。
推断类型可以是内置类型、匿名类型、用户定义类型、.NETFramework类库中定义的类型或任何表达式。
使用var定义变量时有以下四个特点:
1.必须在定义时初始化。
也就是必须是vars=“abcd”形式,而不能是如下形式:
vars;
s=“abcd”;
2.一但初始化完成,就不能再给变量赋与初始化值类型不同的值了。
3.var要求是局部变量。
4.使用var定义变量和object不同,它在效率上和使用强类型方式定义变量完全一样。
typeof
代码输出如下:
元数据
Application.DoEvents();
VisualStudio里的摘要:
处理当前在消息队列中的所有Windows消息。
交出CPU控制权,让系统可以处理队列中的所有Windows消息
比如在大运算量循环内,加Application.DoEvents可以防止界面停止响应
因为winform的消息循环是一个线程来处理,那么假如你的某个操作比较耗时,那么消息处理得等你这个耗时操作做完了才能继续,而Application.DoEvents方法就是允许你在耗时操作的内部调用它,而去处理消息队列中的消息。
像鼠标移动鼠标点击都是windows消息,如果耗时操作一直进行,那么界面就像死锁一样。
while(true){Application.DoEvents();//条件OK,退出循环
}
接口:
装箱和拆箱
装箱和拆箱是值类型和引用类型之间相互转换是要执行的操作。
1.装箱在值类型向引用类型转换时发生
2.拆箱在引用类型向值类型转换时发生
object obj=1;
这行语句将整型常量1赋给object类型的变量obj;众所周知常量1是值类型,值类型是要放在栈上的,而object是引用类型,它需要放在堆上;要把值类型放在堆上就需要执行一次装箱操作。
object objValue=4;
int value=(int)objValue;
上面的两行代码会执行一次装箱操作将整形数字常量4装箱成引用类型object变量objValue;然后又执行一次拆箱操作,将存储到堆上的引用变量objValue存储到局部整形值类型变量value中。
栈
堆
泛型
this的用法
privatestringname;
privatestringalias;
//上面两个变量是私有的,只能在本类中访问,其余的类不能访问他们
//而下面的构造方法是外界能访问的,由于除本类之外的类不能访问上面的两个变量name和alias,但是又要给它们传值(如果不传值定义这两个变量就毫无意义),怎么办呢?
于是就用下面的构造方法,通过这个构造方法的形参name和alias把值传递进来。
这样做的目的就是为了提高程序的安全性,不能让外界直接访问里面的name和alias
//这样在其余的类中就可以写:
Employeeemp=newEmployee("姓名",“别名”);
在本类中就是:
this.name=name;//这里的name=”姓名“;
this.alias=alias;//这里的alias=”别名“
这样就达到了外界并没有访问本类的name和alias,但是值也传递进来了,所以达到了提高安全性的目的
publicEmployee(stringname,stringalias)
{
//将构造方法带的值赋给本类中的name,这个this你可以看成是“本类”的意思
this.name=name;
this.alias=alias;
}
括号里的的参数不一定要取相同的名称这个方法也可以写成
publicEmployee(stringa,stirnb)
{这样写就不用this了,因为这里name和alias是唯一的
name=a;
alias=b;
}
C#的DllImport的用法
DllImport所在的名字空间usingSystem.Runtime.InteropServices;
MSDN中对DllImportAttribute的解释是这样的:
可将该属性应用于方法。
DllImportAttribute属性提供对从非托管DLL导出的函数进行调用所必需的信息。
作为最低要求,必须提供包含入口点的DLL的名称。
DllImport属性定义如下:
namespaceSystem.Runtime.InteropServices
{
[AttributeUsage(AttributeTargets.Method)]
publicclassDllImportAttribute:
System.Attribute
{
publicDllImportAttribute(stringdllName){...}
publicCallingConventionCallingConvention;
publicCharSetCharSet;
publicstringEntryPoint;
publicboolExactSpelling;
publicboolPreserveSig;
publicboolSetLastError;
publicstringValue{get{...}}
}
}
说明:
1、DllImport只能放置在方法声明上。
2、DllImport具有单个定位参数:
指定包含被导入方法的dll名称的dllName参数。
3、DllImport具有五个命名参数:
a、CallingConvention参数指示入口点的调用约定。
如果未指定CallingConvention,则使用默认值CallingConvention.Winapi。
b、CharSet参数指示用在入口点中的字符集。
如果未指定CharSet,则使用默认值CharSet.Auto。
c、EntryPoint参数给出dll中入口点的名称。
如果未指定EntryPoint,则使用方法本身的名称。
d、ExactSpelling参数指示EntryPoint是否必须与指示的入口点的拼写完全匹配。
如果未指定ExactSpelling,则使用默认值false。
e、PreserveSig参数指示方法的签名应当被保留还是被转换。
当签名被转换时,它被转换为一个具有HRESULT返回值和该返回值的一个名为retval的附加输出参数的签名。
如果未指定PreserveSig,则使用默认值true。
f、SetLastError参数指示方法是否保留Win32"上一错误"。
如果未指定SetLastError,则使用默认值false。
4、它是一次性属性类。
5、此外,用DllImport属性修饰的方法必须具有extern修饰符。
托管代码和非托管代码
托管代码(managedcode):
由公共语言运行库环境(而不是直接由操作系统)执行的代码。
托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。
这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。
UnmanagedCode-非托管代码:
在公共语言运行库环境的外部,由操作系统直接执行的代码。
非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务;它与托管代码不同,后者从公共语言运行库中获得这些服务。
非托管代码的英文名是UnmanagedCode,它是在公共语言运行库环境的外部,由操作系统直接执行的代码。
C#中如何调用DLL文件(分两种情况,托管与非托管)
net平台上,调用dll文件有2种含义
1、调用托管dll,即你使用。
net平台开发的dll,属于托管代码
2、调用非托管dll,即传统的dll,一般是C++,VB,DELPHI等等开发出来的,属于非托管代码。
从你的意思中看出来你现在是调用托管的dll,方法是“在解决方案管理器”-“解决方案”(或项目)中的任意地方,右键“添加引用”,“浏览”,选择你需要调用的dll文件,确定即可,该dll会自动复制到bin目录,打包时也会自动复制到你发布的地方。
添加完了引用,现在如何调用呢?
如果有命名空间则引入命名空间,比如你的y。
dll里面,是a命名空间,有一个b类,然后有一个无参数静态方法c
那么调用方法就是a.b.c(),跟你普通的使用类是一样的
然后是非托管dll
需要添加dll的名称,以及方法,也就是你所用到的dll的每个方法都需要添加一次,
[DllImport("msvcrt.dll")]
publicstaticexternintputs(stringc);
Invoke用法
在用.NETFramework框架的WinForm构建GUI程序界面时,如果要在控件的事件响应函数中改变控件的状态,例如:
某个按钮上的文本原先叫“打开”,单击之后按钮上的文本显示“关闭”,初学者往往会想当然地这么写:
voidButtonOnClick(objectsender,EventArgse)
{
button.Text="关闭";
}
这样的写法运行程序之后,可能会触发异常,异常信息大致是“不能从不是创建该控件的线程调用它”。
注意这里是“可能”,并不一定会触发该种异常。
造成这种异常的原因在于,控件是在主线程中创建的(比如this.Controls.Add(...);),进入控件的事件响应函数时,是在控件所在的线程,并不是主线程。
在控件的事件响应函数中改变控件的状态,可能与主线程发生线程冲突。
如果主线程正在重绘控件外观,此时在别的线程改变控件外观,就会造成画面混乱。
不过这样的情况并不总会发生,如果主线程此时在重绘别的控件,就可能逃过一劫,这样的写法可以正常通过,没有触发异常。
正确的写法是在控件响应函数中调用控件的Invoke方法(其实如果大
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 笔记