C#类类型
类:
字段数据【成员变量】
操作数据的成员怕【方法,属性,事件…】
对象:用new创建的某个类类型的实例。
1.构造函数
类没有自定义构造函数,编译器自动为其添加一个默认构造函数。
类定义了自定义构造函数,编译器不再自动添加默认构造函数
类定义了多个构造函数时,可采用:
让一个接受最多参数个数的构造函数做“主构造函数,并且实现必需的验证逻辑”
其余构造函数可使用this关键字把传入的参数转发给主构造函数,并提供必需的其它参数。
class Motorcycle
{
public int driverIntensity;
public string driverName;
public Motorcycle(){}
public Motorcycle(int intensity)
: this(intensity, ""){}
public Motorcycle(string name)
: this(0, name){}
public Motorcycle(int intensity, string name)
{
if(intensity > 10)
{
intensity = 10;
}
driverIntensity = intensity;
driverName = name;
}
...
}
2.static 关键字
1.
C#类或结构可通过static关键字来定义静态成员。
静态成员只能从类级别调用。
类的静态数据分配一次,并被类的所有实例共享。
static可用于定义:
类的数据,类的方法,整个类定义。
2.静态构造函数
CLR在第一次使用之前调用一次所有静态构造函数。
一个类只能定义一个静态构造函数
静态构造函数不允许访问修饰符,不接受参数
静态构造函数,只在运行库创建类实例或调用首次访问静态成员前,执行一次。
3.静态类
静态类不能使用new关键字来创建。
只能包含用static标记的成员和字段。
3.OOP的支柱
–封装:隐藏对象内部实现,且保证数据完整
–继承:促进代码重用。
基于已有类,创建新类。派生类可以继承父类的功能并扩展基类的行为。类型间is-a关系。
包含/委托模型。has-a关系。一个类可以定义另一个类的成员变量,并向对象用户公开它的功能。
class Radio
{}
class Car
{
private Radio myRadio = new Radio();
public void TurnOnRadio(bool onOff)
{
myRadio.Power(onOff);
}
}
–多态:用同样方式处理相关对象
基类为所有的派生类定义一个成员集合【任意个虚拟或抽象成员组成】,即多态接口。
虚拟成员:基类提供默认实现,可被派生类重写。
抽象方法:基类不提供默认实现,提供签名。
封装
C#访问修饰符
1.
1.1.public
作用:
修饰类型成员,此类型成员可从类对象和派生类访问。
修饰类型,类型可供外部程序集访问
1.2.private
修饰类型成员,此类型成员只能由定义它们的类【或结构】访问
修饰嵌套类型,此类型只能由定义它们的类【或结构访问】
1.3.protected
修饰类型成员,类类型成员可由定义它们的类及其派生类访问。不可通过点操作符访问。
修饰嵌套类型,类类型可由定义它们的类及其派生类访问。不可通过点操作符访问。
1.4.【public】internal
修饰类型或类型成员,被修饰的类型和类型成员只能在当前程序集中访问。
1.5.protected internal
被修饰的项,在定义它们的程序集,类,派生类中可用。
2.默认的访问修饰符
类型:内部
类型成员:私有
3.
封装的思想,在于尽量定义私有数据字段。
访问私有字段方式:
函数方式【getxxx,setxxx】
.NET属性
4..NET属性
4.1.属性只是函数方式的简化形式。
class Employee
{
private string empName;
public string Name
{
get { return empName; }
set
{
if (value.Length > 15)
{
Console.WriteLine("Error!");
}
else
{
empName = value;
}
}
}
static void Main(string[] args)
{
Employee emp = new Employee();
emp.Name = "Marv";
Console.WriteLine("Employee name:{0}", emp.Name);
}
}
属性set作用域中,使用value标记来表示调用者设置属性时传入的值,且总是和属性本身的数据类型相同。value标记是上下文关键字。
推荐的方式:只在属性内部使用私有数据。在其它各处,使用属性来访问或设置私有数据。
只含set的属性,是只写属性。
只含get的属性,是只读属性。只读属性只能在初始化时,执行一次赋值。
4.2.静态属性
class SavingsAccount
{
public double currBalance;
private static double currInterestRate = 0.04;
public static double InterestRate
{
get{return currInterestRate;}
set{currInterestRate = value;}
}
}
4.3.自动属性
// 不使用自动属性
class Car
{
private string carName;
private int carSpeed;
private string carColor;
public string PetName
{
get{return carName;}
set{carName = value;}
}
public int PetSpeed
{
get{return carSpeed;}
set{carSpeed = value;}
}
public string PetColor
{
get{return carColor;}
set{carColor = value;}
}
}
// 等价的自动属性表示
class Car
{
public string PetName{get; set;}
public int PetSpeed{get; set;}
public string PetColor{get; set;}
}
自动属性定义时,必须同时支持读写。
// 自动属性默认值
class Garage
{
// 隐藏后备字段,默认值0
public int NumberOfCars{get; set;}
// 隐藏后备字段默认值null
public Car MyAuto{get; set;}
public Garage()
{
MyAuto = new Car();
NumberOfCars = 1;
}
public Garage(Car car, int number)
{
MyAuto = car;
NumberOfCars = number;
}
}
5.对象初始化语法
class Point
{
public int X{get; set;}
public int Y{get; set;}
public Point(int xVal, int yVal)
{
X = xVal;
Y = yVal;
}
pubilc Point(){}
public static void Main(string[] args)
{
Point finalPoint = new Point{ X=30, Y=30};
Point finalPoint2 = new Point(){X=30, Y=30};
}
}
对象初始化语法形式:
new className(…){初始化列表}
初始化列表的每个成员都映射为正在初始化的对象中公共字段或公共属性的名称。
对象初始化语法只是使用 构造函数创建类变量并设置各个属性状态数据的语法的简写形式。
6.常量数据
const修饰
类的常量字段是隐式静态的。
可在类型成员中定义和访问局部常量。
定义常量时须为常量指定初始值。【编译时须知道的值。】
7.只读字段
和常量相似,只读字段不能在赋初始值后改变。
和常量不同的是,赋给只读字段的值可以在运行时决定。【允许在构造函数作用域中赋值,其它处不行。】。且只读字段默认不是静态的。
用readonly修饰。
8.静态只读字段
static + readonly
运行中赋值,需要静态构造函数。
9.分部类
一般一个类用一个.cs文件中。分部类,允许把一个类拆分到多个.cs文件。
每个.cs文件用partial class className{}