C#学习笔记.docx
- 文档编号:4956136
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:44
- 大小:65.54KB
C#学习笔记.docx
《C#学习笔记.docx》由会员分享,可在线阅读,更多相关《C#学习笔记.docx(44页珍藏版)》请在冰豆网上搜索。
C#学习笔记
C#学习笔记
第一章C#简介
第一节什么是.NETFramework
一、.NETFramework的内容
术语表:
●CTS(CommonTypeSystem,通用类型系统)
●CLR(CommonLanguageRuntime,公共语言运行库)
二、如何用.NETFramework编写应用程序
术语表:
●MSIL(MicrosoftIntermediateLanguage,Microsoft中间语言)
●JIT(Just-In-Time,JIT编译器)
●GAC(GlobalAssemblyCache,全局程序集高速缓存)
第二节什么是C#
一、用C#能编写什么样的应用程序
术语表:
●UI(UserInterface,用户界面)
二、本书中的C#
第三节VisualStudio2005
一、VisualStudio2005Express产品
二、VS解决方案
第四节小结
第二章编写C#程序
第一节VisualStudio2005开发环境
第二节控制台应用程序
一、SolutionExplorer
二、Properties窗口
三、ErrorList窗口
第三节WindowsForms应用程序
第四节小结
第三章变量和表达式
第一节C#的基本语法
C#控制台应用程序的基本结构
第二节变量
一、简单类型
二、变量的命名
命名约定:
●Hungarian记号法
●PascalCase,用于简单的变量
●camelCase,用于高级的命名
三、字面值
用“@”符号逐字地指定字符串
四、变量的声明和赋值
第三节表达式
一、数学运算符
1、运算符的重载
2、两个重要的概念:
●用户输入
●类型转换
二、赋值运算符
三、运算符的优先级
四、命名空间
第四节小结
第五节练习
1、在下面的代码中,如何引用命名空间fabulous中的名称great?
答:
fabulous.great
(super.smashing.great)
2、下面哪些不是合法的变量名?
答:
99Flake、
3、字符串supercalifragilisticexpialidocious是因为太长了而不能放在string变量中吗?
为什么?
答:
不是,string变量赋值需要把字符串置于双引号中
(不是,没有限制)
4、考虑运算符的优先级,列出下述表达式的计算步骤。
答:
resultVar+=(var1*var2)+(var3%var4/var5);
首先计算(var1*var2)和(var3%var4/var5),在(var3%var4/var5)中从左向右依次计算;
然后计算(var1*var2)+(var3%var4/var5)的和;
接着计算resultVar+(var1*var2)+(var3%var4/var5)的和;
最后把resultVar+(var1*var2)+(var3%var4/var5)的值赋给resultVar
(resultVar+=(((var1*var2)+var3)%(var4/var5));)
5、编写一个控制台应用程序,要求用户输入4个int值,并显示它们的乘积。
提示:
可以考虑使用Convert.ToDouble()命令,该命令可以把用户在控制台上输入的数转换为double;从string转换为int的命令是Convert.ToInt32()。
答:
详见具体程序。
第四章流程控制
第一节布尔逻辑
&和|运算符与&&和||运算符的区别
一、位运算符
二、布尔赋值运算符
三、运算符的优先级更新
第二节goto语句
第三节分支
一、三元运算符
二、if语句
1、if语句没有结果,所以不在赋值语句中使用它
2、if语句的结果不能赋予一个变量
3、使用if语句判断更多的条件
三、switch语句
用break、goto或return语句添加断点,可以确保在任何情况下,该结构都有一个有效的执行路径
第四节循环
一、do循环
用最少的代码有条件地格式化文本是“?
:
(三元)运算符”最常见的用法
二、while循环
三、for循环
四、循环的中断
五、无限循环
第五节小结
第六节练习
1、如果两个整数存储在变量var1和var2中,该进行什么样的布尔测试,看看其中的一个(但不是两个)是否大于十?
答:
var1>10&&var2>10
((var1>10)^(var2>10))
2、编写一个应用程序,其中包含联系
(1)中的逻辑,让用户输入两个数字,并显示它们,但拒绝接受两个数字都大于10的情况,并要求用户重新输入。
答:
详见具体程序。
3、下面的代码有什么错误?
答:
第四行,“==”错写成“=”。
4、修改Mandelbrot图像应用程序,要求用户输入图像的边界,显示选中的图像部分。
当前代码输出的字符应正好能放在控制台应用程序的一行上。
考虑如何使每个选中的图像正好占据大小相同的空间,以最大化可视区域。
答:
第五章变量的更多内容
第一节类型转换
一、隐式转换
二、显式转换
表达式的溢出检查环境,要用到两个关键字checked和unchecked,语法:
●Checked(expression);
●Unchecked(expression);
三、使用convert命令进行显式转换
第二节复杂的变量类型
一、枚举
1、定义枚举
EnumtypeName//:
underlyingType指定其他基本类型
{
value1,
value2,
value3,
…
valueN
}
2、声明这个新类型的变量
typeNamevarName;
3、赋值
varName=typeName.value;
4、把string转换为枚举值的命令
(enumerationType)Enum.Parse(typeof(enumerationType),enumerationValueString);
二、结构
1、定义结构
struct
{
}
2、声明这个新类型的变量
typeNamevarName;
3、通过句点字符访问这个组合变量中的数据成员
varName.member;
三、数组
1、声明数组
初始化数组
●以字面形式指定数组的完整内容
●指定数组的大小,再使用关键字new初始化所有的数组元素
●两种初始化方式的组合,但是数组大小必须与元素个数相匹配;如果使用变量定义其大小,该变量必须是一个常量
2、foreach循环
foreach(
{
//canuse
}
foreach循环对数组内容进行只读访问
3、多维数组
●二维数组声明
●多维数组声明
4、数组的数组
第三节字符串的处理
●
●
●
●
●
●
●
●
第四节小结
第五节练习
1、下面的转换哪些不是隐式转换?
答:
int转换为short
bool转换为string
2、short类型包含彩虹的颜色,再加上黑色和白色,据此编写color枚举的代码。
这个枚举可以使用byte类型吗?
答:
enumcolor:
short
{
red=1,
orange=2,
yellow=3,
green=4,
blue=5,
Indigo=6,
violet=7,
black=8,
white=9
}
可以
(enumcolor:
short
{
Red,Orange,Yellow,Green,Blue,Indigo,Violet,Black,White
}
可以)
3、修改第4章的Mandelbrot图像生成示例,使用下面的结构表示复杂复杂的数字?
答:
4、下面的代码可以成功编译吗?
如果不能,为什么?
答:
不能,未给数组赋予正确的值。
(不能,没有结束分号;该数组只包含5个元素,无法存储第六个;再给字符串数组元素赋值时没有加双引号)
5、编写一个控制台应用程序,它接收用户输入的一个字符串,将其中的字符以与输入相反的顺序输出。
答:
详见具体程序。
6、编写一个控制台应用程序,它接收一个字符串,用yes替换字符串中所有的no。
答:
详见具体程序。
7、编写一个控制台应用程序,给字符串中的每个单词加上双引号。
答:
详见具体程序。
第六章函数
第一节定义和使用函数
函数定义由以下几部分组成:
●两个关键字
●函数名后跟圆括号
●一个要执行的代码块,放在花括号中
函数名一般采用PascalCasing形式来编写
调用函数:
输入函数名,后跟空括号即可
一、返回值
当函数返回一个值时,可以用下面两种方式修改函数:
●在函数声明中指定返回值的类型,但不使用关键字void
●使用return关键字结束函数的执行,把返回值传送给调用代码
static
{
…
return
}
return语句必须在函数的闭合花括号}之前处理
在用void关键字声明函数时,不能在return关键字和其后的分号之间提供返回值
二、参数
当函数接受参数时,就必须指定下述内容:
●函数在其定义中指定接受的参数列表,以及这些参数的类型
●在每个函数调用中匹配的参数列表
static
{
…
return
}
1、参数匹配
要匹配参数的类型、个数和顺序
必须匹配函数的签名
2、参数数组
C#允许为函数指定一个(只能指定一个)特定的参数,这个参数必须是函数定义中的最后一个参数,称为参数数组。
参数数组可以使用个数不定的参数调用函数,它可以使用params关键字来定义
static
{
…
return
}
调用格式:
3、引用参数和值参数
ref参数:
ref关键字使参数按引用传递。
其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
若要使用ref参数,则方法定义和调用方法都必须显式使用ref关键字。
例如:
classRefExample
{
staticvoidMethod(refinti)
{
i=44;
}
staticvoidMain()
{
intval=0;
Method(refval);
//valisnow44
}
}
备注属性不是变量,因此不能作为ref参数传递;必须使用初始化过的变量
示例按引用传递值类型(如上所示)是有用的,但是ref对于传递引用类型也是很有用的。
这允许被调用的方法修改该引用所引用的对象,因为引用本身是按引用来传递的。
下面的示例显示出当引用类型作为ref参数传递时,可以更改对象本身。
classRefRefExample
{
staticvoidMethod(refstrings)
{
s="changed";
}
staticvoidMain()
{
stringstr="original";
Method(refstr);
//strisnow"changed"
}
}
4、输出参数
out参数:
●把未赋值的变量用作ref参数是非法的,但可以把未赋值的变量用作out参数
●另外,在函数使用out参数时,该参数必须是看作还未赋值,即调用代码可以把已赋值的变量用作out参数,存储在该变量中的值会在函数执行时丢失
out关键字会导致参数通过引用来传递。
这与ref关键字类似,不同之处在于ref要求变量必须在传递之前进行初始化。
若要使用out参数,方法定义和调用方法都必须显式使用out关键字。
例如:
classOutExample
{
staticvoidMethod(outinti)
{
i=44;
}
staticvoidMain()
{
intvalue;
Method(outvalue);
//valueisnow44
}
}
尽管作为out参数传递的变量不需要在传递之前进行初始化,但需要调用方法以便在方法返回之前赋值。
ref和out关键字在运行时的处理方式不同,但在编译时的处理方式相同。
因此,如果一个方法采用ref参数,而另一个方法采用out参数,则无法重载这两个方法。
例如,从编译的角度来看,以下代码中的两个方法是完全相同的,因此将不会编译以下代码:
classCS0663_Example
{
//compilererrorCS0663:
"cannotdefineoverloaded
//methodsthatdifferonlyonrefandout"
publicvoidSampleMethod(outinti){}
publicvoidSampleMethod(refinti){}
}
但是,如果一个方法采用ref或out参数,而另一个方法不采用这两类参数,则可以进行重载,如下所示:
classRefOutOverloadExample
{
publicvoidSampleMethod(inti){}
publicvoidSampleMethod(outinti){}
}
备注属性不是变量,因此不能作为out参数传递。
示例当希望方法返回多个值时,声明out方法很有用。
使用out参数的方法仍然可以将变量用作返回类型(请参见return),但它还可以将一个或多个对象作为out参数返回给调用方法。
此示例使用out在一个方法调用中返回三个变量。
请注意,第三个参数所赋的值为Null。
这样便允许方法有选择地返回值。
classOutReturnExample
{
staticvoidMethod(outinti,outstrings1,outstrings2)
{
i=44;
s1="I'vebeenreturned";
s2=null;
}
staticvoidMain()
{
intvalue;
stringstr1,str2;
Method(outvalue,outstr1,outstr2);
//valueisnow44
//str1isnow"I'vebeenreturned"
//str2is(still)null;
}
}
第二节变量的作用域
局部变量与全局变量
使用static或const来定义全局变量,static允许修改全局变量的值,而const禁止修改;如果局部变量和全局变量同名,全局变量就会被屏蔽
一、其他结构中变量的作用域
“最佳实践”,在声明和初始化所有的变量后,再在代码块中使用它们
二、参数和返回值与全局数据
一般情况下,最好使用参数,而不使用全局数据,但有时使用全局数据更合适
第三节Main()函数
Main函数可以使用四种签名:
●staticvoidMain()
●staticvoidMain(string[]args)
●staticintMain()
●staticintMain(string[]args)
第四节结构函数
关键字不是结构函数所必须的
第五节函数的重载
函数重载允许创建同名的多个函数,这些函数可使用不同的函数类型
第六节委托
委托是一种可以把引用存储为函数的类型,使用delegate关键字
第七节小结
第八节练习
1、下面两个函数都有错误,请指出这些错误。
答:
第一个函数定义的返回值类型是bool,但是函数体没有返回值;第二个函数的参数数组必须定义为参数列表的最后一个参数。
2、编写一个应用程序,该程序使用两个命令行参数,分别把值放在一个字符串和一个整形变量中,然后显示这些值。
答:
详见具体程序。
3、创建一个委托,在请求用户输入时,使用它模拟Console.ReadLine()函数。
答:
delegatestringProcessInput(stringparam);
ProcessInputprocess;
process=newProcessInput(Console.ReadLine());
(classClass1
{
delegatestringReadLineDeglegate();
staticvoidMain(string[]args)
{
ReadLineDelegatereadLine=newReadLineDelegate(Console.ReadLine);
Console.WriteLine(“Typeastring:
”);
stringuserInput=readLine();
Console.WriteLine(“Youtyped:
{0}”,userInput);
}
})
4、修改下面的结构,使之包含一个返回订单总价格的函数。
答:
structorder
{
publicstringitemName;
publicintunitCount;
publicdoubleunitCost;
staticdoubleTotal(intcount,doublecost)
{
doubletotal;
total=count*cost;
returntotal;
}
}
(structorder
{
publicstringitemName;
publicintunitCount;
publicdoubleunitCost;
publicdoubleTotalCost()
{
returnunitCount*unitCost;
}
})
5、在order结构中添加另一个函数,该结构返回一个格式化的字符串,以适合的值替换用尖括号括起来的斜体条目。
答:
structorder
{
publicintunitCount;
publicstringitemName;
publicdoubleunitCost;
publicdoubletotalCost;
staticstringOutputTotal()
{
Console.WriteLine(“OrderInformation:
{0}{1}itemsat${2}each,totalcost${3}”,unitCount,itemName,unitCost,totalCost);
}
}
(tructorder
{
publicstringitemName;
publicintunitCount;
publicdoubleunitCost;
publicdoubleTotalCost()
{
returnunitCount*unitCost;
}
publicstringinfo()
{
return“Orderinformation:
“+unitCount.ToString()+”“+itemName+“itemsat$”+unitCost.ToString()+“each,totalcost$”+TotalCost().ToString();
}
}
第七章调试和错误处理
第一节VisualStudio中的调试
一、非中断(正常)模式下的调试
输出调试信息
●Debug.WriteLine()
●Trace.WriteLine()
两个函数中惟一的字符串参数用于输出消息,而不需要使用{X}语法插入变量值,必须使用+运算符在字符串中插入变量值
usingSystem.Diagnostics;//用于简化函数访问
跟踪下标的方法
在Release模式下没有执行Debug.WriteLine()函数
其它函数:
●Debug.Write()
●Trace.Write()
●Debug.WriteLineIf()
●Trace.WriteLineIf()
●Debug.WriteIf()
●Trace.WriteIf()
1、跟踪点
2、诊断输出与跟踪点
二、中断模式下的调试
1、进入中断模式
断点,是源代码中自动进入中断模式的一个标记,它可以配置为五种方式
进入中断模式的其他方式
●在产生一个未处理的异常时选择进入该模式
●生成一个判定语句时中断,包含两个版本
⏹Debug.Assert()
⏹Trace.Assert()
这两个函数带三个参数(参数的含义)
2、监视变量的内容
3、单步执行代码
4、Immediate和Command窗口
5、CallStack窗口
第二节错误处理
异常
1、try…catch…finally
术语表:
●SEH(StructuredExcept
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 学习 笔记