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.属性和字段

  1. 可访问性,+号表示公共成员,-号表示私有成员。但一般情况下,本章的图中不显示私有成员,因为这些信息是类内部的信息。至于读/写访问,则不提供任何信息。

  2. 成员名。

  3. 成员的类型。

冒号用于分隔成员名和类型。

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.接口

接口成员的定义与类成员的定义相似,但有几个重要的区别:

  1. 不允许使用访问修饰符(public、private、protected或internal),所有的接口成员都是公共的

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

  3. 接口不能定义字段成员。

  4. 接口成员不能用关键字static、virtual、abstract或sealed来定义。

  5. 类型定义成员是禁止的。

 

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编辑  收藏  举报

导航