网站首页 > 技术文章 正文
02010501 类的基本概念
1. 什么是类
- 类 → 是一个能存储数据并执行代码的数据结构,它包含数据成员和函数成员。
- 数据成员存储与类或类的实例相关的数据,它包含如下内容
- 字段
- 常量
- 函数成员:它执行代码,它包含如下内容
- 方法
- 属性
- 构造函数
- 析构函数
- 运算符
- 索引器
- 事件
2. 声明类
- 类的声明定义新类的特征和成员,类的声明并不创建类的实例,但是创建用于生成类实例的模板,类的声明提供如下内容:
- 类的名称
- 类的成员
- 类的特征
class MyClass
{
成员声明
}
说明:
1. class是关键字。
2. MyClass是类名。
3. {}内包含了类成员的声明,{}内部组成了类的主体。
3. 类成员
- 字段和方法是重要的类成员,字段是数据成员,方法是函数成员。
3.1 字段
- 字段是隶属于类的变量,它可以是任何类型(预定义类型或用户定义类型)。字段和所有变量一样用来保存数据,字段有如下特征:
- 可以被写入
- 可以被读取
- 声明一个字段的语句
class MyClass{
int MyInt; // int字段的类型,MyInt是字段的名称。
}
- C#在类型的外部不能声明全局变量。
3.2 显示和隐式字段初始化
- 字段初始化语句是字段声明的一部分,由一个等号后面跟着一个求值表达式组成,字段初始化值必须是编译时可确定的。
class MyClass{
int MyInt = 10; // 字段初始化语句
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// 声明多个字段
int MyInt01, MyInt02;
- 字段如果没有初始化语句,字段的值会被编译器设为默认值,默认值由字段的类型决定。
- 值类型(11种)默认值都是0
- bool类型的默认值是false
- 引用类型的默认值是null
3.3 方法
- 方法是具有名称的可执行代码块,当方法被调用(call/invoke)时,它执行自己所含的代码,有些方法返回一个值到它们被调用的位置。
- 声明方法的语法包括如下部分:
- 返回类型 → 它声明了方法返回值的类型,如果一个方法没有返回值,那么返回类型被指定为void。
- 名称 → 这个方法的名称。
- 参数列表 → 它至少由一对空的()组成,如果有参数将被列到()中间。
- 方法体 → 它由一对{}组成,大括号内包含执行的代码。
class MyClass
{
void MyFunc01() // 返回类型为void,参数列表为无参。
{
执行的代码
}
}
- C#中没有全局函数声明在类型外部,C#中方法没有默认的返回类型(所有方法必须包含返回类型或void)。
4. 创建变量和类的实例
- 类的声明是创建类的实例的模板,一旦类被声明,就可以创建类的实例。
- 要创建类的实例,需要从声明一个类类型的变量开始,如果这个变量没有初始化,那么它的值是未定义的。
5. 为数据分配内存
5.1 类类型变量用来保存引用
MyClass myClass; // 声明类类型变量myClass
说明:
1. 声明类类型的变量所分配的内存是用来保存引用的,而不是用来保存对象实际数据的。
2. 要为实际数据分配内存,需要用到new运算符。
5.2 对象创建表达式
- new运算符为任意指定类型分配并初始化内存,它依据类型的不同从栈或者堆里分配内存。使用new运算符组成一个对象创建表达式,它的组成如下:
- 关键字new
- 要分配内存的实例的类型名称
- 成对的圆括号,可能包括参数也可能没有参数(后面章节会讨论)
- 对象创建表达式语句
new MyClass(); // 对象创建表达式
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
Myclass myClass; // 声明引用变量
myClass = new MyClass(); // 为类对象分配内存并赋值给变量
说明:
说明:
1. 如果将内存分配给一个引用类型,则对象创建表达式返回一个引用,这个引用存放在类型变量分配的内存里面。
2. 这个引用指向在堆中被分配并初始化的对象实例。
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// 将声明引用变量和对象创建表达式合并的写法
MyClass myClass = new MyClass();
5.3 实例成员
class MyClass
{
成员变量
乘以方法
}
class Program
{
static viod Main()
{
MyClass myClass01 = new MyClass(); // 创建类对象,并将类对象引用赋值给变量myClass01
MyClass myClass02 = new MyClass(); // 创建类对象,并将类对象引用赋值给变量myClass02
MyClass myClass03 = new MyClass(); // 创建类对象,并将类对象引用赋值给变量myClass03
}
}
说明:每一个类对象里面都包含有数据成员(成员变量和成员方法),每个对象的数据成员称之为实例成员。
6. 访问修饰符
- 从类的内部,任何函数成员都可以使用成员的名称访问类中任意的其它成员。
- 访问修饰符是成员声明的可选部分,指明程序的其它部分如何访问成员。
// 字段的访问修饰符语句
访问修饰符 类型 标识符;
// 方法的访问修饰符语句
访问修饰符 返回类型 方法名()
{
...
}
- 成员访问控制的5种修饰符
- private → 私有的
- public → 公共的
- protected → 受保护的
- internal → 内部的(后续章节讲解)
- protected internal → 受保护内部的(后续章节讲解)
7. 私有访问和公有访问
- 私有成员只能从声明它的类的访问,其它的类看不见或无法访问它们。
- 私有访问是默认的访问级别,如果一个成员在声明时不写访问修饰符,那它默认就是私有的。
- 还可以使用private访问修饰符显示的将一个成员声明为私有。
- 显式的声明私有和隐式的声明私有在语法上没有不同,两种形式是等价的。
- 实例的公有成员可以被程序的其它对象访问,必须使用public访问修饰符指定公有访问。
class MyClass
{
int MyInt; // 默认为私有字段,直接可以在内的内部使用。
private string MyStr; // 显式的声明为私有字段,直接可以在内的内部使用。
public double MyDouble; // 声明为公有字段,可以通过创建类的实例,在类的外部使用。
void MyFunc01() // 默认为私有方法,直接可以在类的内部使用。同时该方法可以访问类中所有字段
{
...
}
private void MyFunc01() // 显式的声明为私有方法,直接可以在类的内部使用。同时该方法可以访问类中所有字段
{
...
}
public void MyFunc03() // 声明为公有方法,可以通过类的实例在类的外部使用该方法。
{
...
}
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// 从类的外部访问实例成员
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Demo01
{
class Program
{
static void Main(string[] args)
{
MyClass myClass = new MyClass();
myClass.MyFunc();
Console.WriteLine(myClass.MyStr);
Console.ReadLine();
}
}
class MyClass
{
int MyInt = 10;
public string MyStr = "Qinway";
public void MyFunc()
{
Console.WriteLine(MyInt);
}
}
}
控制台输出
10
Qinway
疑问:在类的外部通过类对象myClass访问类的公有方法MyFunc,但是这个公有方法使用了类内部私有的成员MyInt,并没有报错?
说明:要从类的外部访问实例成员,必须包含变量名称和成员名称,中间用“.”进行 分隔,这个"."称为点运算符。
结尾
书籍:C#图解教程
著:【美】丹尼尔 · 索利斯;卡尔 · 施罗坦博尔
译:窦衍森;姚琪琳
ISBN:978-7-115-51918-4
版次:第5版
发行:人民邮电出版社
※敬请购买正版书籍,侵删请联系85863947@qq.com※
※本文章为看书或查阅资料而总结的笔记,仅供参考,如有错误请留言指正,谢谢!※
猜你喜欢
- 2025-10-19 MYSQL有哪些数据类型_mysql哪些数据类型没有长度
- 2025-10-19 个人C++笔记(2) 函数延伸(下)函数重载
- 2025-10-19 泛型中T、?、k、v、extends、super的区别——一篇文章彻底搞懂!
- 2025-10-19 Java 7种类类型,新手必备_java的类型
- 2025-10-19 Java泛型最全详解(图文全面总结)_java 泛型 ?
- 2025-10-19 Java基础——基本类型_java的基本类型的区别
- 2024-08-11 数据类型有哪些?(可变数据类型有哪些)
- 2024-08-11 zig编程语言快速入门——2.15 基础知识-Integer
- 2024-08-11 Java基础 | 基本数据类型(java基本数据类型主要包括)
- 2024-08-11 java Integer值比较(java integer 比较)
- 最近发表
-
- 用Cursor开启JAVA+AI生涯_javascirpt怎么开启
- 大数据调度服务监控平台_大数据调度是什么意思
- SpringBoot、MyBatis、Vue搭建一个Java企业应用开源框架源码分享
- 大数据技术之Flume_大数据volume的含义
- Jenkins运维之路(Slave容器节点)_jenkins slave工作原理
- 程序员自救指南:IDEA 卡成狗?我的 9G 堆内存调参表让你起飞 附避坑
- JMeter:一个简单的测试计划怎么做?
- Windows 命令行终端 PowerShell 美化计划
- JDK25即将发布!新特性概览_jdk52.0
- JDK 25 新特性极简总结(2025 年 9 月 16 日发布,LTS 长期支持)
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (77)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)