Lamda箭头=>
- 在C#6中引入
static <returnType> <FunctionName>(double Myval1, double MyVal2) => Myval1 * MyVal2;
- 直接返回两个数相乘的结果
ref关键字
-
对参数进行引用传递。在函数定义和调用时都要在参数面前使用ref。
-
使用时注意两个点:
- 不能引用const类型的变量。
- 必须使用初始化过的变量。
out关键字
-
out关键字对参数进行引用传递。
-
out关键字和ref关键字有两个重要区别:
- 可以把未赋值的变量用作out参数。
- 使用out时,必须把参数看成未赋值的参数。
函数重载
- 允许创建同名函数,函数的签名不相同。函数的返回类型不是签名的一部分。
委托
- 委托的声明指定了一个返回类型和一个参数列表。
- 使用关键字delegate。
delegate double ProcessDelegate(double param1, double param2); //定义一个委托,其名为ProcessDelegate
static double Multiply(double param1,double param2) => param1*param2; //这两个函数都符合ProcessDelegate规定的外形
static double Divide(double param1,double param2) => param1/param2;
......
ProcessDelegate process; //定义一个ProcessDelegate类变量
.......
process = new ProcessDelegate (Multiply); //括号中填的是函数的名字,而不是相关参数
/* 等价写法 process = Multiply;*/
......
process = new ProcessDelegate (Divide);
对象
- 在OOP中对象的类型就称为类
- 类的实例=对象
字段
- 字段的取值范围仅由存储信息的类型来限制。
- 定义举例
class MyClass
{
public int MyInt;
}
-
readonly
关键字:字段只能在执行构造函数的过程中赋值,或由初始化赋值语句赋值。 -
static
关键字:静态字段。必须通过定义它们的类来访问,而不是通过这个类的对象实例来访问。
属性 -
属性时字段的属性,能过通过属性访问和设定字段。
-
定义举例
public int MyIntProp
{
get
{
//Property get code.
}
set
{
//Property set code.
}
}
- get访问器必须有一个属性类型的返回值。
value
关键字:用户提供的属性值。- 字段与属性搭配使用示例:
class MyClass
{
private int myInt;
public int MyIntProp
{
get
{
return myInt;
}
set
{
if(value >= 0 && value <= 10)
myInt=value;;
else
throw(new ArgumentOutOfRangeException("MyIntProp", value, "MyIntProp must be assigned a value between 0 and 10."));
}
}
}
- 基于表达式的属性:
private int myDoubleInt = 5;
public int MyDoubleIntProp => (myDoubleInt * 2);
自动属性
- 自动属性的定义
public int MyIntprop { get; set;}
- 不需要用户定义相应的字段。编译器会声明一个用于存储属性的私有字段。
- 自动属性必须同时包含
get
和set
存取器。
构造函数
- 第一次实例化一个对象时,需要初始化该对象。这个初始化过程称为构造阶段,由构造函数完成。
- 使用new关键字来调用构造函数:
CupOfCoffee myCup = new CupOfCoffe();
- 通过把默认构造函数设置为private,就可以强制用户使用非默认的构造函数。
- 静态构造函数:
- 创建包含静态构造函数的类实例时执行。
- 访问包含静态构造函数的类的静态成员时执行。
- 无论创建多少个实例,静态构造函数都只调用一次。
- 实例构造函数与静态构造函数相对应。
- 最先调用的构造函数一定是
System.Object.Object()
。 - 默认情况下使用基类的默认构造函数。
- 可以在派生类的构造函数定义中指定所使用的基类构造函数:
public class MyDerivedClass : MyBaseClaee
{
public MyDerivedClass (int i, int j) : base(i)
{
// Do somethings.
}
}
- 用
this
关键字指定在使用指定的构造函数前,.NET实例化过程对当前类使用非默认的构造函数。
public class MyDerivedClass : MyBaseClass
{
public MyDerivedClass() : this(5,6) { }
public MyderivedClass(int i, int j) : base(i) { }
}
析构函数
- 在删除一个函数时,常常需要执行一些清理工作。由析构函数完成。
- 析构函数一般由.NET Framework自动调用。
- 析构函数由带有
~
前缀的类名来声明。 - 调用析构函数后,隐式地调用基类的析构函数。
- 最后调用的是
System.Object
根类中的Finalize()
。
静态成员
- 静态成员看成类的全局对象,可以在类的实例之间共享。
- 静态属性和静态字段可以访问独立于任何对象实例的数据。
- 静态方法可以执行与对象类型相关但与对象实例无关的命令。
接口
- 接口是把公共实例(非静态)方法和属性组合起来,以封装特定功能的一个集合。
- 接口不能单独存在,不能实例化。
- 接口不包含实现其成员的任何代码。
- 实现过程必须在实现接口的类中完成。
- 接口的定义
public interface IMyInterface
{
// Interface members.
}
- 显示地实现接口成员:只能通过接口来访问该成员。
public class MyClass : IMyInterface
{
void IMyInterface.DoSomething() {}
public void DoSomethingElse() {}
}
MyClass myObj = new MyClass();
IMyInterface myInt = myObj;
myInt.DoSomething();
继承
- B类继承A类,B类拥有A类的所有成员。
- 使用
protected
关键字,限定只有派生类才能访问该成员。外部代码不能访问private
和protected
成员。 - 要使用抽象类,必须继承这个类。
sealed
类不能作为基类。
多态性
- 把某个派生类型的变量赋值给基类的变量。
- 多态性下基类实例可以调用派生类实现的基类中的方法,但不能调用派生类特有的方法。
接口的多态性
- 接口不能实例化。
- 可以建立接口类型的变量,然后在支持该接口的对象上,使用这个变量来访问该接口提供的方法和属性。
Cow myCow = new Cow();
Chicken myChicken = new Chicken();
IConsume consumeInterface;
consumeInterface = myCow;
consumeInterface.EatFood();
consumeInterface= myChicken;
consumeInterface.EatFood();
- 派生类会继承基类的接口。
类定义
class myClass
{
// Class members.
}
-
internal
:默认,只有当前项目中的代码才能访问。 -
public
:其它项目中的代码可以访问。 -
abstract
:类是抽象的,只能继承。 -
sealed
:密封,不能继承。 -
在类定义中指定继承
public class MyClass : MyBase
{
// Class members.
}
- 指定一个基类和多个接口
public class MyClass : MyBase, IMyFirstInterface, IMySecondInterface
浅度复制
- 简单地按照成员赋值对象可以通过派生于
System.Object
的MenberwiseClone()
方法来完成。 MenberwiseClone()
是protected
方法。- 浅度复制不考虑引用类型的成员,新对象中的引用成员就会指向源对象中的引用成员。
深度复制
暂略。
成员的访问级别
public
:任何代码都可以访问。private
:默认,只能由类中的代码访问。internal
: 只能由定义它的程序集的内部代码访问。protected
:只能由类或派生类中的代码访问。
方法的定义中的关键字
virtual
:方法可以重写。abstract
:方法必须在非抽象的派生类中重写。override
:方法重写了一个基类方法。extern
:方法定义在其他地方。sealed
:和override
搭配使用,指定派生类中不能对这个方法做进一步修改。
隐藏基类方法
- 只有基类方法是
virtual
时才可以override
。 - 当继承的公共成员不像预期那样工作,就可以隐藏它。
- 隐藏举例:
public class MyBaseClass
{
public void DoSomething()
{
// Base implementation.
}
}
public class MyDerivedClass : MyBaseClass
{
new public void DoSomething() //new可以省略
{
// Derived class implementation, hides base implementation.
}
}
- 若重写基类方法,在使用多态性时,基类访问时使用的是新实现的方法。
- 若隐藏基类方法,在使用多态性时,基类访问时使用的是原来的方法。
base
关键字:派生类重写或隐藏了基类的方法,但是又想使用基类原来的方法,就是用base关键字。
this
关键字
- 把当前对象实例的引用传递给一个方法。
- 限定局部类型的成员。
部分类定义
- 使用
partial
关键字。可将字段、属性和构造函数放在一个文件中,而把方法放在另一个文件中。
部分方法定义
- 使用
partial
关键字。 - 部分方法在一个部分类中定义,在另一个部分类中实现。
- 部分方法不能有返回值。
- 任何参数都不能是out。