面向对象
对象包括属性和方法,属性指对象固有的特征,方法则是对象的行为。
封装 继承 多态(通过类的继承或接口来实现)
访问修饰符:
public(任何项目中访问类)
internal 或者不写(当前项目中访问类)
protected(成员只能由类或派生类中的代码访问)
private(成员仅能被同一个类中的代码访问)
修饰符:
abstract 是抽象的意思,使用它修饰符的类不能被实例化;
sealed 修饰的类是密封类,不能 被继承;
static 修饰的类是静态类,不能被实例化。
类
访问修饰符 修饰符 class 类名
{
类的成员(字段,属性,方法)
}
构造函数
类的构造函数是一个特殊的成员函数,创建类的对象时被调用。
名称与类名相同,没有任何返回值类型。
访问修饰符 类名 (参数列表)
{
语句块;
}
析构函数
在垃圾回收、释放资源时使用
~类名()
{
语句块;
}
嵌套类
嵌套类相当于类中的成员,在访问嵌套类中的成员时必须加上外层类的名称。
部分类,部分方法
访问修饰符 修饰符 partial class 类名{……}
部分方法。 这个东西c.biancheng.net/view/2826.h…,我这么多年就没用过。。。
字段 属性
修饰字段常用的修饰符:
readonly 只读
static 静态字段可以直接通过类名访问
get set
private double price;
public double Price
{
get
{return price;}
set
{
if (value >= 0)
{price = value;}
else
{price = 0;}
}
}
public int test1 { private get; set; }
public int test2 { get; } = 1;
方法
访问修饰符 修饰符 返回值类型 方法名(参数列表)
{
语句块;
}
修饰符:
virtual(虚拟的)
abstract(抽象的)
override(重写的)
static(静态的)静态方法需要通过类的对象才能访问属性或者直接将属性定义成静态的。
sealed(密封的)
参数传递
方法中的参数除了定义数据类型外,还可以定义引用参数和输出参数。引用参数使用 ref 关键字定义,输出参数使用 out 关键字定义。
using System;
namespace ConsoleApp2
{
class Program
{
public static void Test1(int a)
{a = a + 10;}
public static void Test2(ref int a)
{a = a + 10;}
public static void Test3(out int a)
{a = 5;}
static void Main(string[] args)
{
int a = 10;
// 值参数
Test1(a);
Console.WriteLine(a);//10
//ref 关键字声明 引用参数
Test2(ref a);
Console.WriteLine(a);//20
//out 关键字 输出参数会把方法输出的数据赋给自己
Test3(out a);
Console.WriteLine(a);//5
}
}
}
方法重载
方法名称相同、参数列表不同。
参数列表不同主要体现在参数个数或参数的数据类型不同。在调用重载的方法时系统是根据所传 递参数的不同判断调用的是哪个方法。
class Book
{
public Book()
{
Console.WriteLine("no");
}
public Book(string name)
{
Console.WriteLine("name is:" + name);
}
}
lanmda表达式
访问修饰符 修饰符 返回值类型 方法名(参数列表) => 表达式;
public static int Add(int a, int b) => a + b;
public static void Add(int a, int b) => Console.WriteLine(a + b);
继承
virtual 虚拟
能修饰方法、属性、索引器以及事件等,用到父类的成员中
class Program
{
static void Main(string[] args)
{
A a1 = new B();
a1.Print(); //隐藏 子类定义了和父类同名的方法
// 输出 A
A a2 = new C();
a2.Print(); //重写 override关键字 重写了父类的方法
// 输出 C
}
}
class A
{
public virtual void Print()
{
Console.WriteLine("A");
}
}
class B :A
{
public new void Print()
{
Console.WriteLine("B");
}
}
class C :A
{
public override void Print()
{
Console.WriteLine("C");
}
}
abstract 抽象
能修饰类和方法
//抽象方法是一种不带方法体的方法,仅包含方法的定义,抽象方法必须定义在抽象类中
访问修饰符 abstract 方法返回值类型 方法名(参数列表);
//抽象类 抽象类不能实例化
//抽象类中可以定义抽象方法,也可以定义非抽象方法。
//通常抽象类会被其他类继承,并重写其中的抽象方法或者虚方法。
// *在实际应用中,子类仅能重写父类中的虚方法或者抽象方法,
// *当不需要使用父类中方法的内容时,将其定义成抽象方法,否则将方法定义成虚方法。
sealed 密封
能修饰类或者类中的方法
//密封方法必须出现在子类中,并且是子类重写的父类方法,即 sealed 关键字必须与 override 关键字一起使用
//密封类不能被继承,密封方法不能被重写。
接口
接口中定义的成员必须满足以下要求。
- 接口中的成员不允许使用 public、private、protected、internal 访问修饰符。
- 接口中的成员不允许使用 static、virtual、abstract、sealed 修饰符。
- 在接口中不能定义字段。
- 在接口中定义的方法不能包含方法体。
interface ICompute
{
int Id { get; set; }
string Name { get; set; }
void Total();
void Avg();
}