C# 类的初步认识
类
基础语法
[访问修饰符][修饰符] class 类名{
字段;
属性;
方法;
}
实例化一个对象
classStudy myInfo = new classStudy(); // 生成一个对象
myInfo.Age = 18; // 设置字段
myInfo.Name = "lddragon";
myInfo.GetNameAndAge(); // 使用对象方法
1 修饰符
1 类的访问修饰符主要有两个,即
internal
和public
,如果省略了访问修饰符,即为internal
。2 用
internal
或者不写时代表只能在当前项目中访问类;public
则代表可以在任何项目中访问
类中成员的访问修饰符有 4 个,具体用法如下。
1 public
成员可以被任何代码访问。
2 private
成员仅能被同一个类中的代码访问,如果在类成员前未使用任何访问修饰 符,则默认为
private
。3 internal
成员仅能被同一个项目中的代码访问。
4 protected
成员只能由类或派生类中的代码访问。派生类是在继承中涉及的,将在后面详细介绍。
2 字段
1 字段的定义与前面介绍的变量和常量的定义类似,只是在变量或常量前面可以加上访问修饰符、修饰符。
2 在修饰字段时通常用两个修饰符,即
readonly
(只读)和static
(静态的)。 使用
readonly
修饰字段意味着只能读取该字段的值而不能给字段赋值。 使用
static
修饰的字段是静态字段,可以直接通过类名访问该字段。
private int id; //定义私有的整型字段 id
public readonly string name; //定义公有的只读字符串类型字段 name
internal static int age; //定义内部的静态的整型字段 age
private const string major = "计算机"; //定义私有的字符串类型常量 major
字段在类中定义完成后,在类加载时,会自动为字段赋值,不同数据类型的字段默认值不同, 如下表所示。
数据类型 | 默认值 |
---|---|
整数类型 | 0 |
浮点型 | 0 |
字符串类型 | 空值 |
字符型 | a |
布尔型 | False |
其他引用类型 | 空值 |
3 方法的定义
定义
访问修饰符 修饰符 返回值类型 方法名(参数列表)
{
语句块;
}
1) 访问修饰符
所有类成员访问修饰符都可以使用,如果省略访问修饰符,默认是 private。
2) 修饰符
在定义方法时修饰符包括 virtual(虚拟的)、abstract(抽象的)、override(重写的)、static(静态的)、sealed(密封的)。override 是在类之间继承时使用的。
3) 返回值类型
用于在调用方法后得到返回结果,返回值可以是任意的数据类型,如果指定了返回值类型,必须使用 return 关键字返回一个与之类型匹配的值。如果没有指定返回值类型,必须使用 void 关键字表示没有返回值。
4) 方法名
对方法所实现功能的描述。方法名的命名是以 Pascal 命名法为规范的。
5)参数列表
在方法中允许有 0 到多个参数,如果没有指定参数也要保留参数列表的小括号。参数的定义形式是“数据类型参数名”,如果使用多个参数,多个参数之间需要用逗号隔开。
4 属性操作
class classStudy
{
// 1 字段
private int _age;
private string _name;
// 2 属性
// 属性的存在就是为了保护字段,对字段的赋值与取值做限制
public int Age
{
get { return this._age; }
set {
// 限制Age
if (value<0|value>100)
{
value = 18;
}
_age = value;
}
}
private string Name
{
get {
// 限制Name
if(this._name != 'lddragon')
{
return this._name = "xxx";
}
return this._name;
}
set { _name = value; }
}
// 3 方法
public void GetNameAndAge()
{
Console.WriteLine("我今年{0}了,我叫{1}", this.Age, this.Name);
}
}
通过上面的实例可以看出,在定义字段属性时,属性的作用就是为字段提供 get、set 访问器,由于操作都比较类似,在 C# 语言中可以将属性的定义简化成如下写法。
public int Id{get; set;}
public string Name{get; set;}
public double Price{get; set;}
如果使用上面的方法来设置属性,则不需要先指定字段。如果要使用自动属性的方式来设置属性表示只读属性,直接省略 set 访问器即可。只读属性可以写成如下形式。
public int Id{get;}=1;
5 静态与非静态
// 静态
1.静态类不能被实例化
2.静态类中的所有都是静态的
3.静态使用 类名.方法/属性
4.类中的静态方法只能访问静态属性
// 非静态
1.非静态使用: 对象名.方法
2.类中静态和非静态都能访问
1 如果你想把你的类当成工具类:可以使用静态类
2 静态类在整个项目中是资源共享的
6 构造函数
作用: 帮助我们初始化对象(给每一个属性都依次的赋值)
构造函数是一个特殊的方法
1.构造函数没有返回值,连void都没有
2.构造函数的名称一定要和类名一样的
// 构造函数
public classStudy(string name, int age)
{
// 与python中的init一样 创建对象时执行
this.Name = name;
this.Age = age;
}
classStudy myInfo = new classStudy("lddragon",18); // 生成一个对象
构造函数可以重载
7 关键字New
new 帮我们做了三件事
1.在内存中开辟了一块空间
2.在开辟的空间中创建对象
3.调用对象的构造函数进行初始化对象
8 this
1 代表当前类的对象
2 在类当中显示的调用本类的构造函数
// 构造函数
public classStudy(string name, int age)
{
// 与python中的init一样 创建对象时执行
this.Name = name;
this.Age = age;
}
public classStudy(string name):this(name,0) // 方法重载解决带啊冗余
{
}
9 析构函数
~classStudy(){
代码块
}
// 程序结束的时候才会执行
// 帮助我们释放资源