读书笔记之——c#入门经典第五版.PDF

C# 
多为概念性的知识点:


.NET Framework 具有两个主要组件:公共语言运行库和 .NET Framework 类库

OOP 面向对象技术
通用类型系统 CTS (Common type system)
公共语言运行库 CLR (common language Runtime) 类似java的jdk
CIL (common intermediate language)通用中间语言、编译的第一个步骤,由vs或 vce 完成。
JIT just-in-time 需要执行时由JIT编译器 编译成机器语言。类似java的jvm,针对不同os和cpu有不同的版本。
把可重用的代码放到所有程序都可以访问的地方,就成为全局程序集缓存GAC(global assembly cache)
程序集中包含CIL代码exe 和 其他库 dll
CLR可以托管代码,让.net自己与操作系统进行交互。好处是垃圾回收可以自动进行,但是程序员仍要进行必要的手动处理,不能依赖不定时的自动清理功能。

C#使用的是.Net Framework,几种常见的应用程序类型:
* windows应用程序:使用。net framework的 Windows Forms模块。比如office。
windows forms 模块是个空间库。包含很多按钮菜单工具栏等,用于创建windows用户UI。
也可以用Windows Presentation Foundation(WPF)来建立应用程序。

*Web应用程序:开发web页面,用浏览器查看,.NetFramework 有个动态生成web的系统——Active Server Pages .Net(ASP.Net).
也可以用Silverlight 编写在浏览器内部运行的应用程序。

*Web 服务。

以上类型访问数据库时候 用到的。net Framwork模块 就是Active Data Objects。Net(ADO.NET)
这个是常见常用到的,还有其他ADO.NET Entity FrameWork 或C#的LINQ 等。

。net Framework 也有其他资源 创建联网组件、输出图形、执行复杂数学任务的工具。

第二章
控制台应用程序:console Application F5运行完,debug目录生成,F6,在release目录生成,exe文件,可以点击运行的。
F5 调试时候末尾加 console.readkey(); 否则控制台会一闪而过。
class-view 视图怎么打开-类视图
属性窗口-properies window 中修改可直接影响代码

控制台应用程序:比较简单的命令行应用程序,可以用来演示。

windows窗体应用程序,windows Forms 可以添加各种控件,最大化关闭等。

第三章
C#编译器,忽视空格tab回车符等。所以只要以分号结尾,理论上可以一行多个语句,也可以一条语句分多行。
Console.WriteLine("Hello world !"); 区分大小写
#region-#endregion 设置代码折叠用来突出显示。

整数类型 byte short int long
还有sbyte ushort uint ulong 用来区分正负,精度值域是相同的。
比如byte 是2的8次方256位,0-255 ,sbyte 是-128~127 其他u开头都自然数。
u与s 是sign 与unsigned的缩写。无符号位的意思
浮点数类型 decimal float double 精度递大。问题:怎么适用?
其他三种简单类型
char bool string
char 是unicode 字符,存储0~65535 的整数。

myString = "\"My Integer is\""; 转移字符反斜杠\ 有歧义的输出字符,前面加\
String myString1 = "this string has a\nline break"; \n 表换行转义。而且前后无空格也能识别。
如果想在字符串中输出俩个\\,就要分别配\\\\总共4给才行。
Console.WriteLine("{0}{1}", myString, myInteger); 不太懂啊,输出俩变量,连接到一起。
选中变量等关键字,双击shift键,全屏筛选加底色。

C#变量命名规范区分大小写。
hungarian(匈牙利) 命名法 iAge 表示int类型。但在大项目中容易混淆,所以建议用变量作用来命名,鼠标停留一段类型IDE会显示类型的。
camelCase 骆驼命名法 or PascalCase 区别是首单词的首字母是否大写。看命名单词的命名规范就造。

字面量规范,100L long类型的100;1.5f float类型的1.5 1.5m decimal类型的1.5

转义字符有对应的unicode ,比如\'单引号对应0x0027
比如下面字符串等价:可用0027代表单引号'
"ZP\' string"
"ZP\u0027s string"

或者用整体转义的字符@ 来代替逐个\转义。
比如"F:\\ZP\\BOOK"
或者 @"F:\ZP\BOOK"

int a=5 声明并初始化。赋值可以作为初始化。声明和初始化是两个可以分开的概念。

a=++b 表示a的值是b+1;b的值+1
a=b++ 表示a的值是b; b的值+1
-- 同理

a=console.readline()//获取用户输入
double b=convert.ToDouble(a)

a-=b 等效于 a=a-b;
+=运算符可以用于字符串。.

名称空间相当于比类更大的范围,namespace 之前的全局要引用名称空间内的名称,需要加.来引用
LevelOne.NameOne
名称空间可以嵌套,所以不同空间名称可以重复
using 语句用来简化这种带.的不同名称空间的引用。
如果命名有冲突,可起别名:
using LT=levelTwo;
然后在外层命名空间,就可以用LT.nametwo来引用LevelTwo.nametwo。 自己的nametwo就用nametwo引用。

using System;
System命名空间是.NET Framework应用的根命名空间。包括了控制台应用程序所需要的所有基本功能。

#所有命名空间是所有其他namespace的外部命名空间,引用就加using,或者文件加进来,用全路径加点引用。

运算符优先级
resultVar+=var1*var2+var3%var4/var5
2元运算符优先级同数学。*/%混合运算符合结合律。亲测。

第四章
逻辑运算符
! & | ^ 分别:非 与 或 异或(有且仅有一个为true)
&& || 连用 与& | 功能相同,但性能更好。所以更常用
或者是 & | ^ ~位运算符。 int类型转换成01代码,重新算数,~是按位取反。除数学应用外不太常用。
补位主要用来计算负数,因为二进制的原因,导致-x可定义为~x+1 ,那么10+(-5)=10-5=+5 最前面多1位1 表示正号。呵呵。
位运算还在颜色编辑有用到。000 黑色,100 010 001 分别表示红绿蓝。111表白色。十进制是7
位移运算符 (可扩展)
var1=var2>>var3 1是2的往右移3位得到。 1位是乘除2 ,var3位,即2的var3次方。 位移运算一般用于高度优化的代码,驱动程序或系统代码。


三元运算符
<test>?<resultIfTrue>:<resultIfFalse> 其中test是bool值
可以直接赋值eg
string resultString=(myInteger<10)?"Less than 10":"Greater than or equal to 10";
如果啥比较大小,并做大量操作,就应该用if
if else 可以嵌套,也可以并列,
if{}
else if{}
else{}
可缩减成switch 可配合return goto等

const 常量修饰符
const int intTwo=2; 必须赋值,且只能赋值一次。

console.writeLine("in {0} year{1},you'll have a balance of {2}",totalYears,totalYears==1?"":"s",balance);
三元运算符最常用的应用——用最少的代码有条件的格式化文本。

循环
do{}while();与while(){}区别,dowhile至少会执行一次

dowhile or while循环常用作用户输入的有效性检查。
Console.WriteLine("what balance would you like to have");
do
{
targetBalance=Convert.ToDouble(Console.ReadLine)
if()
Console.WriteLine("you must enter an amount greater than your current balance\nPlease enter anoter value");
}
while(targetBalance<=balance);

for 循环与 while循环最大区别,for可以指定次数,并维护自己的计数器。
4个终端循环的命令
break continue goto return
依次为:立即终止循环;立即终止当前的循环,继续执行下一次循环;
可跳出循环,到标记位置;跳出循环及其所包含的函数。
使用goto跳出循环是合法的,使用goto从外部进入循环则是非法的。

98页习题多看看。

第五章 高级变量类型

枚举,结构,数组
隐式转换和显示转换
低精度向高精度的转换可直接进行,成为隐式
显示转换即被称为强制类型转换。eg:前面加(byte)
还可以强制检查是否溢出,转换类型前加checked
byte b; int a=256;
b=checked((byte)a) 如果溢出则程序报错overflow
IDE可以设置默认是unchecked 还是 checked

枚举数据类型 自己声明描述一个类型,并声明这个类型的变量。关键字 enum
定义:
enum<tpyeName>{<value1>,<value2>,<value3>}
声明
<typeName> <varName>
赋值
varName=typeName.value

枚举的基本数据类型默认为int,也可以指定其他,语法为
enum <tpyeName>:<underlyingType>{a,b,c,d}

讲string类型转换为枚举值,语法比较复杂,用到Enum.Parse() 和 typeof()
eg:
string myString="North"
orientation myDirection=(orientation)Enum.Parse(typeof(orientation),myString);
疑问:string类型的枚举怎么声明。

结构struct 缩写structure
struct name
{enum a;double b}

结构和枚举一样,也是再代码的主体之外声明,在名称空间之内。
结构的元素需要加访问权限,如public

数组
<baseType>[] <name>;
basetype也可以是枚举enum 和 结构struct类型;数组必须在访问之前初始化。
初始化的两种方法
1,以字面形式指定数组的完整内容。类似穷举
2,int[] myIntArray=new int[5]; 用new关键字初始化。默认值是0; 也可以用变量初始化。

遍历数组中每个元素时,最好用foreach.只读访问,直接用作输出。
foreach (<baseType> <name> in <array>){//can use <name> for each element}

多维数组,
double [,] hillHeight=new double[3,4];
表示3行4列的数组。举例穷举:hillHeight[3,4]={{1,2,3,4},{2,3,4,5},{3,4,5,6}}
索引是0开始,比如hillHeight[2,1]值为 第3行,第2列,即是 4.
测试多维数组的foreach 会给出实际值。

数组的数组
也称为锯齿数组,与多维数组(也称为矩形数组)相比,锯齿数组的每个元素,也是一个数组,而且子数组的元素个数可以不尽相同。
也可引申更深层次,数组的数组的数组。 但是这些数组都必须有相同的基本类型。

字符串处理
string 类型变量可以看作是char变量的只读数组。

省略trim split 等字符串方法应用

第六章
方法
return 所有的处理路径都必须执行到return 否则就不合法。会报错。
通过void声明的方法,如果用return函数会立马终止,且不允许return后跟返回值,只能是;分号

参数数组
如果一个方法,参数是数组类型,而且需要传入元素数量不确定,可以用params修饰。
eg 输入任意个数的int数字,然后返回几个数字之和。static int SumValues(params int [] values){return sum}
参数数组 是作为参数的一个数组。
数组参数,是把数组当参数。
实质一样,侧重点不一样,属偏正短语。

引用参数&值参数。
ref关键字,修饰函数参数。适用范围:调用函数会改变参数的值。这也决定了,参数必然不能是const类型。也必须初始化。不然函数没意义了
out 关键字,可以是未赋值。

局部变量与全局变量重复,则在方法内使用全局变量,则要指明全名:class.para即类名点变量名。
?什么时候适用全局变量

雷到我了,结构里面居然能套函数和声明变量。
可集中处理常见任务,简化过程。

值传递和引用传递 的不同也可以看作是函数的重载。
eg static void ShowDouble(ref int val){}
static void ShowDouble(int val){}

?托管代码与非托管代码区别

委托把delegate 把方法又抽象了一层。
我理解委托是C#对OOP概念的彻底化 ,把返回值和参数相同的方法 也抽象出来了,这个类起个名字称为 委托,语法重新定义,没有方法体,初始化时候,参数是其他方法的方法名。使用时候可以把委托对象,当成方法名用。
定义
delegate double processDelegate(double para1,double para2)
static double Multiply(double para1,double para2){……}
static double Divide(double para1,double para2){……}
声明
processDelegate process
初始化
process=new processDelegate(Multiply) 或者 process=new processDelegate(Divide)//多么霸气,把方法名当参数。
使用
double result=process(double para1,double para2);

命令行参数,即使main (string []args) 中args的参数值,在项目-右键-调试里,有命令行参数填写位置。用空格分隔。

第七章,调试和错误处理
跳过了

第八章,oop

以下几个概念,指的都是在类里面
构造函数
所有类定义都至少包含一个构造函数。默认构造函数是无参数的,并且与类同名。
Coffee myCoffee=new Coffee();
也可包含几个带有参数的构造函数,称为非默认的构造函数。
Coffee myCoffee=new Coffee("blue mountain");

静态属性和方法 字段,可看作类的全局对象。静态成员可以在类的实例之间共享。使用静态成员甚至不用实例化对象
比如:console.writeLine(); Convert.ToString()等。

静态构造函数:一个类只能有一个静态构造函数。不能有访问修饰符,也没有参数。在创建该类实例时执行,或访问包含静态构造函数的类的静态成员时执行。
非静态构造函数也称为实例构造函数。

如果希望一个类只包含静态成员,可以将类 设置为 静态类。静态类只包含静态成员,不需要实例构造函数。因为他不能被实例化。

接口是把公共实例(非静态)方法和属性结合起来,以封装特定功能的一个集合。一旦定义了接口,就就可以 在类中实现它。这样,类就可以支持接口所指定的所有属性和成员。

值类型和引用类型的一个主要区别就是:值类型总是包含一个值,而引用类型可以是null,表示不包含值。
只有string和object简单类型是引用类型,数组也是隐式的引用类型。每个类都是引用类型。
基本数据类型&引用数据类型。
结构类型和类的重要区别就是 结构是值类型。

抽象方法只能存在于抽象类中

对象的生命周期:用构造函数创建对象,用析构函数删除对象。
永远不应手动调用对象的析构函数,.Net运行库环境会在垃圾回收过程中自动完成该任务。
实现IDisposed接口的类对象,可以删除。

实例成员只能在类的对象实例上使用,静态成员只能直接通过类定义使用,它不与实例关联。

接口是可以在类上实现的公共属性和方法的集合。
多态性:从一个派生类中实例化的所有对象都可以看作是其父类的实例。

第九章 定义类
默认声明class 是内部的,修饰符internal 即只有当前项目中的代码才能访问它。
也可以是public 可由其他项目中的代码访问

修饰符 abstract/sealed 抽象/密封的,
抽象类不能实例化,只能继承;密封只能继承
所以俩关键字互斥

所以抽象类必须这样声明
public abstract class MyClass{
//class members,may be abstract
}
其 myclass 是一个公共抽象类,也可以是内部抽象类。
与抽象类一样,密封类也可以是公共或内部的。

编译器不允许派生类的可访问性高于基类。内部类可继承一个公共基类;反之则不行。

——————————————————

类库项目:如果一个项目什么都不包含,只包含类(以及其他相关的类型定义,但没有入口点),该项目称为类库。
类库编译为.dll程序集,在其他项目中添加对类库项目的引用。
?引用放到项目下面会怎么样?

接口和抽象类
同: 都包含可由派生类继承的成员;都不能被实例化;但可以声明这些类型的变量。
如果声明变量,则可用多态性,把继承这两种类型的对象指定给他们的变量。以通过这些变量使用这些类型的成员,但不能直接访问派生对象的其他成员。

异:派生类只能继承一个基类,即是只能直接继承一个抽象类(但可以用继承链包含多个抽象类)
接口则无数量限制。两种做法实际效果区别不大
接口的成员都是公共的(他们倾向在外部使用),抽象类的成员可以是私有的(只要他们不是抽象的)受保护的,内部的等。
此外,接口不能包含字段 构造函数 析构函数 静态成员 或常量。

抽象类主要用作对象系列的基类,共享某些主要特性,例如,共同的目的和结构。接口则主要用于类,这些类在基础水平上有所不同,但仍可以完成某些相同的任务。

浅度复制和深度复制
把每个成员从一个对象复制到另一个对象中可能不会成功,因为其中一些成员可能是引用类型。
简单的按照成员复制对象可以用object的MemberwiseClone()方法完成。称为浅度复制。因为他没考虑引用类型成员。
因此,新对象中的引用成员就指向源对象中相同成员的对象,有时候并不满意这样处理。
如果要创建新实例(复制值,而不复制引用),则需要deep copy 深拷贝,而不是shallow copy浅度复制
具体需要自己实现, 可以实现一个ICloneable接口,如果使用这个接口,就必须实现它包含的Clone()方法。这个方法返回一个object类型的值。
具体就是序列化方法或者手动重新new一个,挨个赋值每个成员,再返回对象。

静态类的主要特征
1,仅包含静态成员
2,无法实例化
3,是密封的
4,不能包含实例构造函数

静态类在编译时会被自动标记为sealed 密封不继承

虽然字段不能声明为 static const,但const字段的行为在本质上是静态的。
C#不支持静态局部变量(在方法内部定义静态变量)
在C#中静态成员是比较敏感的东西,在不是十分确认的情况下不要使用;

.NetFramework中公共字段以 PascalCasing 形式来命名
比如 public int MyInt;
私有变量 用camelCasing命名。

字段也可以使用关键字 readonly,表示这个字段只能在执行构造函数的过程中赋值,或由初始化赋值语句赋值。

静态字段必须通过定义他们的类 来访问,在上面的示例中,是MyClass.MyInt;而不是通过这个类的对象实例来访问。静态方法也一样。
另外,可以使用关键字const来创建一个常量,const也是静态的,所以不必加static修饰符,加了会报错。

方法还可以加以下关键字
virtual:方法可以重写
abstract:方法必须在非抽象的派生类中重写(只用于抽象类中)
override:方法重写了一个基类方法(如果方法被重写,就必须使用该关键字)
extern:方法定义放在其他地方。

公共属性也用PascalCasing方式命名。与字段和方法一样。
eg
public int MyIntProp
{
get{}
set{}
}

可以把字段设为私有,外部的代码使用属性来访问字段。

属性可以使用virtual override abstract 关键字,就像方法一样,但这几个关键字不能用于字段。
属性可以保证安全,当不在本类中使用时可以保证使用属性名,避免用字段名,而在属性里面可以加限制,保证字段安全
如在set get里加判断和抛出异常;属性没有存储数据的功能,数据都存在字段中,所以只有修改字段的数据才能更改数据,修改属性的值没用。

常量是一个符号,是在编译时已经存在且在程序生命周期内不会发生改变的值

vitual方法
虚方法,可在派生类中override 覆盖,不覆盖也可由实例调用
无此标记,也无其他标记,重写时需用new隐藏原方法,但无virtual也可用new
abstract和virtual 重写时都使用override关键字。
用new关键字,可以隐藏基类方法

base与this关键字
this 也可以用在类成员内部,引用当前对象实例,即不能在静态成员中使用this关键字,因为静态成员不是对象实例的一部分。

嵌套类型定义,java中应该叫内部类
myNestedClass

隐藏与重写区别(new与override区别)
运用多态,用基类型引用派生类对象调用被隐藏或重写的方法时,new调用基类方法,override调用派生类方法。

接口成员不能包含代码体。

**其他
在一个类中,如果一个变量能够用来描述一个类的属性,那就定义为成员变量,否则,它就应该定义为局部变量。而如果一个变量在全局中都能使用(某个内容是被所有对象所共享),那么我们就可以把这个变量用static来修饰,即为静态变量。(还要注意它与静态方法的紧密联系,这里且不细述了)

类加载的本质 是将字节码文件(编译过的文件,如class文件)通过类加载器加载到内存中。

第11章
一个程序集可以跨越n个命名空间,一个命名空间也可以包含n个程序集.

如果说命名空间是类库的逻辑组织形式,那么程序集就是类库的物理组织形式。
只有同时指定类型所在的命名空间及实现该类型的程序集,才能完全限定该类型

更新至261页

PQT8W-68YB2-MPY6C-9JV9X-42WJV visual C# express 注册码(visual C# express 2010)

转载于:https://www.cnblogs.com/uranus-zp/p/5549574.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值