本节知识点:
- OOP是什么?
- 类是什么?
- OOP的基本思想是什么
- 声明类的关键字是什么
- 类的命名规则是什么?请举一个类声明的例子
- 声明空类的基础语法是什么
- 类的访问修饰符是什么
- 最常见的声明类的位置是什么
- 类的四大基本成员是什么?
一、OOP是什么
OOP 就是面向对象编程。它的全拼是 Object Oriented Programming。
面向对象是一种以“对象”为中心编写代码的思想。
补充说明:
- Object - 对象:程序中的基本实体(虚拟实体),将数据和操作数据的方法捆绑在一起。
- Oriented - 面向 / 导向:表示这种编程方法是围绕“对象”这个概念来进行的。
- Programming - 编程:指软件开发的过程。
面向对象编程是一种编程范式(Programming Paradigm),其核心思想是使用 “类和对象” 来设计程序。
“范式”就是“解决问题的哲学”、“编程的世界观”、“编程的思维方式”。
如果建造一座房子,西方人和东方人对这件事的看法差异很大。欧式古典是一种范式,中式古典也是一种范式。编程范式也是如此。它不仅仅是语法技巧,更是一套如何理解程序、如何组织代码的思想和规则。如果说编程的语法是“术”,那么面向对象编程就是“道”。
- 面向过程:认为程序是一系线性执行的步骤。思维重心是“第一步做什么,第二步做什么”。
- 面向对象:认为程序是一些相互作用的对象。每个对象都有自己的属性和方法。思维重心是“谁来做,它有什么,能做什么”。
简单来说,OOP 就是一种以“对象”为中心来组织代码的编程方法论。
二、类是什么?
定义:类是创建对象的模板,定义了同类对象的共同的特征和行为。
补充说明:
类是创建对象的模板
- 类只是一个模板、一个定义。它自己什么都不做,也不占地方。
- 模板是用来创建对象的。
- 类是一种抽象的概念,是对象的统称。比如:人类,鸟类
- 对象是具体的"实物"。比如:张三、李四;喜鹊、燕子
类定义了某类事物共同的特征和行为
- 特征:它有什么(静态属性)。(比如:人的特征:五官特征、皮肤颜色、毛发颜色等)
- 行为:它能做什么(动态行为)。(比如: 直立行走、 嘴巴唱歌等)
三、OOP的基本思想是什么
类是面向对象编程的核心,所以面向对象编程的基本思想就是:
- 将数据和方法封装到对象中
- 通过类来定义和管理对象
四、声明类的完整语法是什么(语法)
完整语法
[attributes] [access-modifiers] [class-modifiers] class ClassName
[type-parameters] [constraints] [: base-class] [, interfaces]
{
// 类成员(字段、属性、方法、构造函数等)
}
完整语法对于初学者过于复杂,没关系,分步骤,一步一步“蚕食”它就可以了。
五、声明空类(语法)
无论类的结构多么复杂,任何一个类的都离不开如下基础定义:
基础语法:声明一个不包含任何成员的空类的
[访问修饰符] class ClassName
{
}
-
class 关键字:声明类的核心关键字。只要声明类,就要使用
class关键字。 - 类名:使用一个名字表示类。类名遵循帕斯卡(PascalCase)命名规范。无论类名由几个单词组成,每个单词的首字母要大写。
提示:在C#中声明类时,类本身就是一种数据类型,不需要额外指定数据类型。类没有返回值,所以也无需像方法那样,指定返回值类型。
基础语法:创建一个对象
ClassName 对象名 = new ClassName();
六、类的访问修饰符是什么
用途:控制类的可见性。即从哪些位置可以访问类。
| 访问修饰符 | 可用于顶级类 | 可用于嵌套类 | 描述 |
|---|---|---|---|
public |
✅ | ✅ | 无访问限制 |
internal |
✅ | ✅ | 同一程序集内可访问 |
private |
❌ | ✅ | 仅包含类内可访问 |
protected |
❌ | ✅ | 包含类及派生类可访问 |
protected internal |
❌ | ✅ | 同一程序集或派生类可访问 |
private protected |
❌ | ✅ | 同一程序集中的派生类可访问 |
public(顶级类修饰符)
-
public表示无访问限制,在任何位置都可访问类。即从外部项目也能访问当前类。 -
public属于顶级类修饰符。是最常用的类访问修饰符。
示例
LessonClassDeclare1/Program.cs
namespace LessonClassDeclare1;
using LessonClassDeclare2;
class Program
{
static void Main(string[] args)
{
PublicClass publicObj = new PublicClass();
}
}
LessonClassDeclare2/Program.cs
namespace LessonClassDeclare2;
class Program
{
static void Main(string[] args)
{
PublicClass publicObj = new PublicClass();
}
}
public class PublicClass
{
}
internal class InternalClass
{
PublicClass publicObj = new PublicClass();
}
internal(顶级类修饰符)
-
internal表示只能在定义它的项目(程序集)内部访问。 -
internal属于顶级类修饰符。是类的默认访问修饰符。
示例
LessonClassDeclare1/Program.cs
namespace LessonClassDeclare1;
using LessonClassDeclare2;
class Program
{
static void Main(string[] args)
{
//public修饰符可以访问,不报错
PublicClass publicObj = new PublicClass();
//internal修饰符不可以访问,报错
InternalClass internalObj = new InternalClass();
}
}
LessonClassDeclare2/Program.cs
namespace LessonClassDeclare2;
class Program
{
static void Main(string[] args)
{
//可以访问
InternalClass internalObj = new InternalClass();
}
}
public class PublicClass
{
//可以访问
InternalClass internalObj = new InternalClass();
}
internal class InternalClass
{
}
private(嵌套类修饰符)
-
private表示只能在父类(包含类)内部访问。 -
private修饰符只能作为嵌套类出现。 - C#编译器会根据类的声明位置应用默认规则
internal或private。- 在命名空间内声明的类,默认 internal
- 在另一个类内部声明的类,默认 private
示例
namespace LessonClassDeclare2;
class Program
{
static void Main(string[] args)
{
// 不可以在包含类外部使用
InnerPrivateClass inner = new InnerPrivateClass();
}
}
public class PublicClass
{
// 不可以在包含类外部使用
InnerPrivateClass inner = new InnerPrivateClass();
}
internal class InternalClass
{
}
public class OuterClass
{
private class InnerPrivateClass
{
// 这个类只能在 OuterClass 内部访问
}
public void UsePrivateClass()
{
// 可以在包含类内部使用
InnerPrivateClass inner = new InnerPrivateClass();
}
}
protected(嵌套类修饰符)
protected internal(嵌套类修饰符)
七、声明类的位置
在 C# 中,类可以在多个不同的位置声明,每个位置都有其特定的用途和限制。声明类的位置:
- 命名空间内(最常见、最普遍)
- 另一个类的内部(嵌套类)
- struct结构体内
- 全局命名空间内
- 接口内
- 方法内
命名空间内(最常见的位置)
namespace MyCompany.MyApplication
{
// 顶级类 - 最常见的声明位置
public class Customer
{
public string Name { get; set; }
public string Email { get; set; }
}
// 另一个顶级类
internal class DataAccess
{
public void SaveData() { /* ... */ }
}
}
特点:
- 最常用的声明方式
- 可以组织相关的类在一起
- 避免命名冲突
注意:尽量避免在全局命名空间中声明类,容易引起命名冲突。
八、类的四大基本成员是什么
一个典型的类,通常至少包含四个成员:
- 字段:类中的变量,用于存储数据。
- 属性:是对字段的封装,封装的目的是为了安全的向外展示字段数据。
- 方法:用于定义对象行为。
- 构造函数:用于初始化对象。
九、声明字段类(语法)
在这里,字段类指仅包含字段成员的类。
基本语法:声明字段类
[访问修饰符] class ClassName
{
// 字段声明的基本语法
[访问修饰符] 数据类型 字段名;
}
字段名
- 标识符
- 私有字段,推荐使用驼峰式(camelCase)或下划线前缀( _camelCase)
- 公共字段,推荐使用帕斯科命名法;
- Unicode字符可行不推荐
数据类型
任何有效的C#类型都可以用来声明字段。如:int、char、bool、string、DateTime、int[]、string[],甚至ClassName等。
示例
// 字符串类型字段
public string Name;
// 整数类型字段
private int age;
// 浮点数类型字段
internal double height;
// 布尔类型字段
protected bool isActive;
// 日期时间类型字段
public DateTime birthDate;
// 自定义类型字段
private Address address;
// 字符串
public string firstName;
private string _lastName;
// 数组
public int[] numbers;
private string[] names;
// 集合
public List<string> items;
private Dictionary<int, string> keyValuePairs;
// 自定义类
public Address homeAddress;
private Person _owner;
// 对象类型
internal object anyData;
字段访问修饰符
用途:字段的访问修饰符控制着字段的可访问性。
| 访问修饰符 | 可用于字段 | 描述 | 使用示例 |
|---|---|---|---|
public |
✅ | 任何地方都可以访问(同类) | public int Score; |
internal |
✅ | 同一程序集内可访问 (同类) | internal string InternalData; |
private |
✅ | 仅当前类内可访问(默认) | private string _name; |
protected |
✅ | 当前类及派生类可访问 | protected int BaseValue; |
protected internal |
✅ | 同一程序集或派生类可访问 | protected internal string SharedData; |
private protected |
✅ | 同一程序集中的派生类可访问 | private protected int InternalSecret; |
字段的访问修饰符比类的修饰符更加灵活,所有6种修饰符都可以在字段上使用,没有顶级/嵌套的限制。
示例
public class ExampleClass
{
// ✅ 所有6种访问修饰符都可以用于字段
// 1. public - 无限制访问
public string PublicField = "任何人都可以访问";
// 2. internal - 程序集内访问
internal int InternalField = 100;
// 3. private - 仅当前类内访问(默认)
private string _privateField = "只有ExampleClass可以访问";
// 4. protected - 当前类及派生类访问
protected double ProtectedField = 3.14;
// 5. protected internal - 程序集内或派生类访问
protected internal bool ProtectedInternalField = true;
// 6. private protected - 程序集中的派生类访问
private protected DateTime PrivateProtectedField = DateTime.Now;
public void TestAccess()
{
// ✅ 在类内部可以访问所有字段
Console.WriteLine(PublicField);
Console.WriteLine(InternalField);
Console.WriteLine(_privateField);
Console.WriteLine(ProtectedField);
Console.WriteLine(ProtectedInternalField);
Console.WriteLine(PrivateProtectedField);
}
}
示例: 声明一个学生类(Student),记录学生信息
- 姓名
- 年龄
namespace LessonClass
{
class Student
{
// 定义字段存储学生信息
public string Name; // string 是数据类型
public int Age; // int 是数据类型
public DateTime BirthDate; // DateTime 是数据类型
}
class Program
{
static void Main( )
{
Student student = new Student();
student.name = "张三";
student.age = -5;
}
}
}