Starting C#
Starting C#:
3. 变量和表达式:
1.浮点数变量类型:float、double 和decimal。前两种可以用+/-m×2e的形式存储浮点数,m和e的值因类型而异。decimal使用另一种形式:+/- m×10e。
2.Console.WriteLine("{0} {1}.", myString, myInteger);
输出字符串是"{0} {1}.",它们并没有包含有用的文本。可以看出,这并不是我们运行代码时希望看到的结果,其原因是:字符串实际上是插入变量内容的一个模板,字符串中的每对花括号都是一个占位符,包含列表中每个变量的内容。每个占位符(或格式字符串}用包含在花括号中的一个整数来表示。整数从 0 开始,每次递增 1,占位符的总数应等于列表中指定的变量数,该列表用逗号分隔开,跟在字符串后。把文本输出到控制台时,每个占位符就会用每个变量的值来替代。在上面的示例中,{0}用第一个变量的值myString替换,{1}用myInteger的内容来替换。
3.Console.ReadKey(); 暂停代码的执行,等待用户按下一个键。
4.也可以逐字地指定字符串,即两个双引号之间的所有字符都包含在字符串中,包括行末字符和需要转义的字符。唯一例外是双引号字符的转义,它们必须指定,以免结束字符串。为此,可以在该字符串之前加一个@字符:
@"C:\Temp\MyDir\MyFile.doc" == "C:\\Temp\\MyDir\\MyFile.doc"
5.userName = Console.ReadLine();
6.可以使用 namespace 关键字为花括号中的代码块显式定义名称空间。如果在该名称空间代码的外部使用名称空间中的名称,就必须写出该名称空间中的限定名称。
7.这里要用到两个关键字checked和unchecked,称为表达式的溢出检查上下文。在将一个值放在一个变量中时,如果该值过大,不能放在该类型的变量中,就会导致溢出,这就需要检查。
8.enum <typeName> : <underlyingType> 在枚举声明中添加类型,就可以指定其他基本类型
9.double[,] hillHeight = new double[3,4];二维数组的声明,和这个一样: double[,] hillHeight = { { 1, 2, 3, 4 }, { 2, 3, 4, 5 }, { 3, 4, 5, 6 } }; 3行4列
hillHeight[2,1] 访问多维数组
<baseType>[,,,] <name>; 4维数组
6.函数
1.一般采用PascalCase形式编写函数名。
2.用作 ref 参数的变量有两个限制。首先,函数可能会改变引用参数的值,所以必须在函数调用中使用“非常量”变量。即函数处理的变量与函数调用中使用的变量相同,而不仅仅是值相同的变量。因此,对这个变量进行的任何改变都会影响用作参数的变量值。为此,只需使用ref关键字指定参数: static void ShowDouble(ref int val)
3.除了按引用传递值之外,还可以使用out关键字,指定所给的参数是一个输出参数。out关键字的使用方式与ref关键字相同(在函数定义和函数调用中用作参数的修饰符)。实际上,它的执行方式与引用参数完全一样,因为在函数执行完毕后,该参数的值将返回给函数调用中使用的变量。但是,存在一些重要区别。
把未赋值的变量用作ref参数是非法的,但可以把未赋值的变量用作out参数。
另外,在函数使用out参数时,out参数必须看作是还未赋值。
static int MaxValue(int[] intArray, out int maxIndex)
4.static string myString; 全局变量
5.委托的声明非常类似于函数,但不带函数体,且要使用 delegate 关键字。委托的声明指定了一个返回类型和一个参数列表。
7.调试
1.断点 和 跟踪点
2.debug 模式 和 release 模式
3.代码中未处理的异常会使应用程序终止。使用try、catch和finally代码块处理异常try块标记了一个启用异常处理的代码断,catch 块包含的代码仅在异常发生时执行,它可以匹配特定类型的异常,还可以包含多个catch块。finally块指定异常处理完毕后执行的代码,如果没有发生异常,finally块就指定在try块执行完毕后执行的代码。只能包含一个finally块,如果包含了catch块,finally块就是可选的。
8.面向对象编程简介
1.统一建模语言(Unified Modeling Language,UML)
2.属性和字段
-
可访问性,+号表示公共成员,-号表示私有成员。但一般情况下,本章的图中不显示私有成员,因为这些信息是类内部的信息。至于读/写访问,则不提供任何信息。
-
成员名。
-
成员的类型。
冒号用于分隔成员名和类型。
3.方法
“方法”这个术语用于表示对象中的函数。这些函数调用的方式与其他函数相同,使用返回值和参数的方式也相同,用于提供访问对象的功能。
4.在UML中,每个参数都带有下述标识符之一:in、out或inout。它们用于表示数据流的方向,其中out和inout大致对应于第6章讨论的C#关键字out和ref。in大致对应于C#中不使用这两个关键字的情形。
5.析构函数:一般情况下,不需要提供析构函数的代码,而是由默认的析构函数自动执行操作。
9.定义类
1.除了这两个访问修饰符关键字外,还可以指定类是抽象的(不能实例化,只能继承,可以有抽象成员)或密封的(sealed,不能继承)。为此,可以使用两个互斥的关键字 abstract 或 sealed(相当于final)。
2.还可以在类定义中指定继承。为此,要在类名的后面加上一个冒号,其后是基类名,例如:public class MyClass : MyBase
在C#的类定义中,只能有一个基类,如果继承了一个抽象类,就必须实现所继承的所有抽象成员(除非派生类也是抽象的)。
3.除了以这种方式指定基类外,还可以在冒号之后指定支持的接口。如果指定了基类,它必须紧跟在冒号的后面,之后才是指定的接口。如果没有指定基类,则接口就跟在冒号的后面。必须使用逗号分隔基类名(如果有基类)和接口名。
public class MyClass : IMyInterface
public class MyClass : MyBase, IMyInterface
public class MyClass : MyBase, IMyInterface, IMySecondInterface
4.
无或internal 只能在当前项目中访问类
public 可以任何地方访问类
abstract或internal abstract 类只能在当前项目中访问,不能实例化,只能供继承之用
public abstract 类可以在任何地方访问,不能实例化,只能供继承之用
sealed或internal sealed 类只能在当前项目中访问,不能供派生之用,只能实例化
public sealed 类可以在任何地方访问,不能供派生之用,只能实例化
5.接口
声明接口的方式与声明类的方式相似,但使用的关键字是interface,
访问修饰符关键字public和internal的使用方式是相同的,与类一样,接口也默认定义为
public interface IMyInterface
内部接口。所以要使接口可以公开访问,必须使用public关键字
不能在接口中使用关键字 abstract 和 sealed
接口的继承也可以用与类继承类似的方式来指定。主要的区别是可以使用多个基接口
public interface IMyInterface : IMyBaseInterface, IMyBaseInterface2
接口不是类,所以没有继承System.Object
10.定义类成员
1.
public——成员可以由任何代码访问。
private——成员只能由类中的代码访问(如果没有使用任何关键字,就默认使用这个关键字)。
internal——成员只能由定义它的程序集(项目)内部的代码访问。
protected——成员只能由类或派生类中的代码访问。
2..NET Framework中的公共字段以PascalCasing形式来命名,而不是camelCasing,这里使用的就是这种命名方法。这就是上面的字段叫作MyInt,而不是myInt的原因。这仅是推荐使用的命名模式之一,但它的意义非常重大。私有字段没有推荐的命名模式,它们通常使用camelCasing来命名。
3. static——方法就只能通过类来访问,不能通过对象实例来访问。
virtual——方法可以重写。
abstract——方法必须在非抽象的派生类中重写(只用于抽象类中)。
override——方法编写了一个基类方法(如果方法被重写,就必须使用该关键字)。
public override void DoSomething()
extern——方法定义放在其他地方。
4.定义属性
属性定义方式与字段类似,但包含的内容比多。如前所述,属性涉及的内容比字段多,是因为它们在修改状态前还可以执行一些额外的操作。实际上,它们可能并不修改状态。属性拥有两个类似于函数的块,一个块用于获取属性的值,另一个块用于设置属性的值。这两个块也称为访问器,分别用get和set关键字来定义,可以用于控制对属性的访问级别。
属性的基本结构包括标准的可访问修饰符(public、private),后跟类名、属性名和 get 块(或 set块,或者get块和set块,其中包含属性处理代码)
区别是行末没有分号,而是一个包含嵌套get和set块的代码块。
private int myInt;
public int MyIntProp {
get {
// Property get code.
return myInt;
}
set {
// Property set code.
myInt = value;
}
}
类外部的代码不能直接访问这个 myInt 字段,因为其访问级别是私有的。外部的代码必须使用属性来访问该字段。
属性可以使用virtual、override和abstract关键字,就像方法一样,但这几个关键字不能用于字段。
5.接口
接口成员的定义与类成员的定义相似,但有几个重要的区别:
-
不允许使用访问修饰符(public、private、protected或internal),所有的接口成员都是公共的
-
接口成员不能包含代码体。
-
接口不能定义字段成员。
-
接口成员不能用关键字static、virtual、abstract或sealed来定义。
-
类型定义成员是禁止的。
11.集合,比较和转换
1.但数组有一定的限制。最大的限制是一旦创建好数组,它们的大小就是固定的,不能在现有数组的末尾添加新项,除非创建一个新的数组。这常常意味着用于处理数组的语法比较复杂。
2.集合的功能(包括基本功能,例如,用[index]语法访问集合中的项)可以通过接口来实现,该接口不仅没有限制我们使用基本集合类,例如 System.Array,相反,我们还可以创建自己的定制集合类。这些集合可以专用于要枚举的对象(即要从中建立集合的对象)。这么做的一个优点是定制的集合类可以是强类型化的。也就是说,从集合中提取项时,不需要把它们转换为正确的类型。另一个优点是提供专用的方法,
3.System.Collections名称空间中的几个接口提供了基本的组合功能:
-
IEnumerable可以迭代集合中的项。
-
ICollection(继承于 IEnumerable)可以获取集合中项的个数,并能把项复制到一个简单的数组类型中。
-
IList(继承于IEnumerable和ICollection)提供了集合的项列表,允许访问这些项,并提供其他一些与项列表相关的基本功能。
-
IDictionary(继承于IEnumerable和ICollection)类似于IList,但提供了可通过键值(而不是索引)访问的项列表。
System.Array类实现IList、ICollection和IEnumerable
4.
ArrayList animalArrayList = new ArrayList();
animalArrayList.Add(myCow2);
foreach (Animal myAnimal in animalArray) { IEnumerable接口
Console.WriteLine("New {0} object added to Array collection, " + "Name = {1}", myAnimal.ToString(), myAnimal.Name);
}
animalArray[0].Feed();您可以直接调用项的方法
2.索引符
public class Animals : CollectionBase
public Animal this[int animalIndex] {
get {
return (Animal)List[animalIndex];
}
set {
List[animalIndex] = value;
}
}
animalCollection[0].Feed();
3.迭代器
IEnumerable接口负责使用foreach循环
4.比较
is 运算符。
使用IComparable和IComparer接口对集合排序
5.转换
重载转换运算符
as运算符 <operand> as <type>
14. C#语言的改进
1.初始化器
public Curry()
{
}
public void Add(T animal)
{
animals.Add(animal);
}
<ClassName> <variableName> = new <ClassName>
{
<propertyOrField1> = <value1>,
<propertyOrField2> = <value2>,
...
<propertyOrFieldN> = <valueN>
}; 可以嵌套
2.类型推理
引入了新关键字var,它可以替代前面代码中的type:var <varName> = <value>;
变量<varName>隐式地类型化为value的类型。注意,类型的名称并不是var。
3.匿名类型
匿名类型(Anonymous type)是简化这个编程模型的一种方式。其理念是使用C#编译器根据要存储的数据自动创建类型,而不是定义简单的数据存储类型。
4.动态查找
1.dynamic类型
dynamic myDynamicVar;
posted on 2013-05-25 01:58 Step-BY-Step 阅读(205) 评论(0) 编辑 收藏 举报