C#要点简记_CH6-CH10

Lamda箭头=>

  • 在C#6中引入
static  (double Myval1, double MyVal2) => Myval1 * MyVal2;
  • 直接返回两个数相乘的结果

ref关键字

  • 对参数进行引用传递。在函数定义和调用时都要在参数面前使用ref。

  • 使用时注意两个点:

  1. 不能引用const类型的变量。
  2. 必须使用初始化过的变量。

out关键字

  • out关键字对参数进行引用传递。

  • out关键字和ref关键字有两个重要区别:

  1. 可以把未赋值的变量用作out参数。
  2. 使用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;}
  • 不需要用户定义相应的字段。编译器会声明一个用于存储属性的私有字段。
  • 自动属性必须同时包含getset存取器。

构造函数

  • 第一次实例化一个对象时,需要初始化该对象。这个初始化过程称为构造阶段,由构造函数完成。
  • 使用new关键字来调用构造函数:
CupOfCoffee myCup = new CupOfCoffe();
  • 通过把默认构造函数设置为private,就可以强制用户使用非默认的构造函数。
  • 静态构造函数:
  1. 创建包含静态构造函数的类实例时执行。
  2. 访问包含静态构造函数的类的静态成员时执行。
  3. 无论创建多少个实例,静态构造函数都只调用一次。
  • 实例构造函数与静态构造函数相对应。
  • 最先调用的构造函数一定是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关键字,限定只有派生类才能访问该成员。外部代码不能访问privateprotected成员。
  • 要使用抽象类,必须继承这个类。
  • 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.ObjectMenberwiseClone()方法来完成。
  • 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。

你可能感兴趣的:(C#笔记)