1. 类声明的一般结构
想象一下:C#里的类就像一栋楼的蓝图。在蓝图里我们会写清楚有几间房、墙是什么颜色、门窗在哪。类里就是描述对象有哪些属性(比如名字、年龄)和能干啥(比如“打招呼”、“要工资”)。
类的声明总是包含三个主要部分:
- 访问修饰符(public、private、internal、protected)——谁能用这个类。为了简单起见,我们现在用public,这样类“到处都能看见”。
- 关键字class——让编译器明白我们确实是在描述一个类。
- 类名——按惯例首字母大写。
- 用大括号包起来的类体——这里面写上类的所有内容:字段、属性、方法。
大致长这样:
public class 类名
{
// 这里会有类的字段、属性和方法
}
例子:学生类
public class Student
{
// 字段(属于对象的变量)
public string Name;
public int Age;
}
现在这个类就像个空盒子:我们说了学生应该有名字和年龄,但还没教他干啥。
2. 类的字段(fields)
字段就是属于类对象的变量。比如每个学生都得有自己的名字和年龄——所以它们写成字段:
public class Student
{
public string Name;
public int Age;
}
现在你创建Student类型的对象时,每个对象都会有自己的名字和年龄。
创建对象的例子:
Student sasha = new Student();
sasha.Name = "萨沙";
sasha.Age = 20;
这里我们创建了sasha对象,然后分别给他的字段赋值。这个方式适合最简单的入门(关于构造函数我们下节课会详细聊)。
3. 类的方法(functions)
方法就是对象的“动词”,也就是它能做的事。比如学生可以打招呼。为此我们在类里写个方法:
public class Student
{
public string Name;
public int Age;
public void SayHello()
{
Console.WriteLine($"你好,我叫{Name},我{Age}岁了!");
}
}
现在每个学生都能“打招呼”——而且会用自己的名字和年龄。
方法的使用例子:
Student sasha = new Student();
sasha.Name = "萨沙";
sasha.Age = 20;
sasha.SayHello(); // 会输出:你好,我叫萨沙,我20岁了!
4. 类的属性(properties)
属性就是“智能”字段,可以在读写值时加点特殊操作。在现代C#里属性比字段用得多,因为更灵活、可控。就像电一样:看着简单,其实能玩出花来。
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
}
这里get; set;会自动生成字段,但以后可以加逻辑。对类的使用者来说,属性和字段几乎一样用。
例子:
Student katya = new Student();
katya.Name = "卡佳";
katya.Age = 18;
Console.WriteLine(katya.Name); // 卡佳
关于类属性的细节——下节课再聊 :P
5. 注释
无聊但很重要!和其他代码一样,类里也要写注释,说明字段或方法是干啥的:
public class Student
{
// 学生的名字
public string Name { get; set; }
// 学生的年龄(单位:岁)
public int Age { get; set; }
// 学生打招呼
public void SayHello()
{
Console.WriteLine($"你好,我叫{Name},我{Age}岁了!");
}
}
这样代码更容易看懂,就算项目很大也不容易迷路。
6. 访问修饰符
访问修饰符就像不同锁的门。它们决定了谁、从哪能访问类的成员。主要有这些:
- public:到处都能访问(我们现在默认用这个)。
- private:只能在这个类里用。
- internal:只能在当前程序集(项目、库)里用。
- protected:只能在类和它的子类里用。
例子:把字段藏起来不让外部访问:
public class Student
{
private int age; // 只能在Student里用
public string Name { get; set; }
public void SetAge(int value)
{
if (value > 0)
age = value;
}
public int GetAge()
{
return age;
}
}
刚开始学时大家都喜欢把成员都写成public,这样不容易搞混,但实际项目里这么做不好:有些实现细节最好藏起来。
7. 类的静态成员
有时候类里有些数据或方法不是属于某个对象,而是属于整个类。这就是静态成员(static members)。
比如:我们想统计学生的总数。
public class Student
{
public static int StudentsCount = 0;
public string Name { get; set; }
public int Age { get; set; }
}
访问静态成员要用类名:
Student.StudentsCount = 0;
每个对象有自己的属性/字段,但静态的是大家共用的。比如有10个学生,每个人有自己的Name,但StudentsCount只有一个。
8. 例子:完整的学生类(带方法版)
我们来把所有东西拼一起,写个功能齐全、格式规范的学生类:
public class Student
{
// 静态学生计数器——属于所有学生
public static int Count = 0;
// 名字和年龄——属性
public string Name { get; set; }
public int Age { get; set; }
// 构造函数(构造函数下节课讲)
public Student(string name, int age)
{
Name = name;
Age = age;
Count++; // 每创建一个对象计数器+1
}
// 打招呼方法
public void SayHello()
{
Console.WriteLine($"你好!我是{Name}。我{Age}岁。");
}
}
主程序里的用法:
class Program
{
static void Main()
{
Student sasha = new Student("萨沙", 20);
Student katya = new Student("卡佳", 22);
sasha.SayHello();
katya.SayHello();
Console.WriteLine($"学生总数:{Student.Count}");
}
}
9. 代码组织:一个文件=一个类
在.NET里,通常每个public类放一个单独的文件,文件名和类名一样。比如:
Student.cs
|
|__ public class Student
主程序文件(Program.cs)里写入口和主逻辑。这样项目里类多了也好找。
10. 用类和对象时常见的坑
坑1:忘了大括号或者写错位置。
编译器会报错,但有时候不太好找是哪错了。尤其是代码长了,大括号乱了很难定位。
坑2:在同一个命名空间里声明了两个同名类。
编译器绝对不让你这么干。其实也好,不然你自己都搞不清用的是哪个类。
坑3:字段和属性名字写成一样。
这样用类成员时会很混乱。就算老司机有时也会懵:“我这是用字段还是属性?”
坑4:没写访问修饰符。
默认类会变成internal,如果你写库的话,外部可能就访问不到了。
坑5:通过实例访问静态成员。
如果写成student.Count而不是Student.Count,编译器可能不报错,但会让人迷糊。这样看起来Count像是某个学生的,其实是大家的。
GO TO FULL VERSION