一、成员变量(Member Variables)
1.概念:
成员变量是定义在类(class
)内部的变量,用于描述对象的状态或属性。它们属于类的实例(对象),每个对象都有自己独立的成员变量。
2.基本规则:
1.声明在在类语句块中:
成员变量必须定义在类的内部(即类的 {}
内),而不是在方法或函数中。
public class Person
{
// ✅ 正确:声明在类的内部
private string name; // 规则1
private int age; // 规则1
public void SayHello()
{
// ❌ 错误:局部变量,不是成员变量
string greeting = "Hello!";
Console.WriteLine(greeting);
}
}
2.用来描述对象的特征:
成员变量应体现对象的属性或状态。
汽车类
public class Car
{
// 描述汽车的属性(规则2)
public string Brand; // 品牌
public string Color; // 颜色
public double Price; // 价格
}
学生类
public class Student
{
// 描述学生的属性(规则2)
public int StudentId; // 学号
public string Name; // 姓名
public List<string> Courses; // 选修课程
}
3.可以是任意变量类型:
成员变量可以是值类型、引用类型、集合甚至自定义类型。
public class Game
{
// 规则3:不同类型
public string Title; // 字符串类型
public int PlayerCount; // 整数类型
public DateTime ReleaseDate; // 日期类型
public List<string> Tags; // 集合类型
public Developer Studio; // 自定义类类型
}
public class Developer
{
public string CompanyName;
}
4.数量不做限制:
一个类中可以包含任意数量的成员变量。
public class Book
{
// 规则4:多个成员变量
public string ISBN; // 国际标准书号
public string Title; // 书名
public string Author; // 作者
public int PageCount; // 页数
public decimal Price; // 价格
public bool IsAvailable; // 是否可售
}
5.根据需求来确定是否赋值。
public class Smartphone
{
// 规则1:声明在类内部
// 规则2:描述手机特征
// 规则3:多种类型
// 规则4:多个变量
// 规则5:部分赋值
public string Brand = "Unknown"; // 直接赋值
public string Model; // 暂不赋值
public double ScreenSize; // 屏幕尺寸(英寸)
public int BatteryCapacity; // 电池容量(mAh)
public bool IsWaterproof; // 是否防水
}
// 使用
Smartphone phone = new Smartphone();
phone.Model = "Galaxy S23"; // 后续赋值
phone.ScreenSize = 6.8;
phone.BatteryCapacity = 5000;
二、访问修饰符(Access Modifiers)
1.概念:
访问修饰符用于控制类、方法、变量等的可访问范围。C#中主要有以下访问修饰符:
public
:完全公开,任何地方都能访问。 public int Age;
private:
仅在当前类内部可访问(默认修饰符)。private string Name;
protected:
当前类内部和继承的子类可访问。 protected string Address;
internal:
同一程序集(Assembly)内可访问。 internal int Salary;
三、成员变量与访问修饰符的典型用法
1. 直接使用 public
(不推荐)
public class Person
{
public string Name; // 直接公开,外部可随意修改
}
// 使用
Person p = new Person();
p.Name = "Alice"; // 直接访问
//问题:破坏了封装性,无法控制数据的合法性。
2. 使用 private
+ 属性(推荐)
public class Person
{
private string name; // 私有字段,外部无法直接访问
// 公共属性(Property),控制访问
//优点:通过属性封装,可以添加验证逻辑。
public string Name
{
get { return name; }
set
{
if (!string.IsNullOrEmpty(value)) //添加了个判断 只有非空时才赋值
name = value;
}
}
}
// 使用
Person p = new Person();
p.Name = ""; // 无效!name 不会被修改
p.Name = null; // 无效!name 不会被修改
p.Name = "Alice"; // 有效!name 变为 "Alice"
四、不同访问修饰符的作用范围
示例:
public class MyClass
{
public int PublicVar; // 所有地方可访问
private int PrivateVar; // 仅MyClass内部可访问
protected int ProtectedVar; // MyClass及其子类可访问
internal int InternalVar; // 同一程序集可访问
}
public class DerivedClass : MyClass
{
public void Test()
{
ProtectedVar = 10; // 允许(子类访问protected变量)
// PrivateVar = 20; // 错误!无法访问父类的private变量
}
}
// 其他类中的访问
public class AnotherClass
{
public void Test()
{
MyClass obj = new MyClass();
obj.PublicVar = 30; // 允许
// obj.PrivateVar = 40; // 错误!
obj.InternalVar = 50; // 同一程序集允许
}
}
五、默认访问修饰符
-
类的成员变量:默认是
private
。 -
类本身:默认是
internal
(如果未指定)。internal
类:只能在当前程序集内使用。
六、常见错误
public class MyClass
{
private int secret;
public void SetSecret(int value)
{
secret = value; // 正确:类内部可以访问private变量
}
}
public class AnotherClass
{
public void HackSecret()
{
MyClass obj = new MyClass();
// obj.secret = 123; // 错误!无法访问其他类的private变量
}
}
七、练习题
1、定义一个人类,有姓名,身高,年龄,住址等特征,用人创建若干个对象
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 练习
{
#region 一、定义一个人类,有姓名,身高,年龄,住址等特征,用人创建若干个对象
class Person
{
public string name;
public int height;
public int age;
public string homeAddress;
}
#endregion
#region 二、定义一个学生类,有姓名,学号,年龄,同桌等特征,用学生类创建若干个学生
class Student
{
public string name;
public int id;
public int age;
public Student deskmate; //同桌
}
#endregion
#region 三、定义一个班级类,有专业名称,教师容量,学生,创建一个班级对象
class Class
{
public string name; //
public int capacity; //容量
public Student[] students; //学生类类型成员变量
}
#endregion
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("练习题");
#region 练习四
//Person p = new Person();
//p.age = 5;
//Person p2 = new Person();
//p2.age = 10;
求p.age是多少?5
#endregion
#region 练习五
//Person p = new Person();
//p.age = 5;
//Person p2 = p;
//p2.age = 10;
求p.age? 答案:10
//Console.WriteLine(p.age);
#endregion
#region 练习六
//Student s = new Student();
//s.age = 10;
//int age = s.age;
//age = 20;
//Console.WriteLine(s.age);//10
#endregion
#region 练习七
Student s = new Student();
s.deskmate = new Student();
s.deskmate.age = 10;
Student s2 = s.deskmate;
s2.age = 20;
Console.WriteLine(s.deskmate.age); //20
#endregion
//#region 一、定义一个人类,有姓名,身高,年龄,住址等特征,用人创建若干个对象
//Person p = new Person();
//p.name = "小明";
//p.height = 100;
//p.age = 8;
//p.homeAddress = "成华大道";
//Person p2 = new Person();
//p2.name = "小红";
//p2.height = 100;
//p2.age = 8;
//p2.homeAddress = "富贵街";
//#endregion
//#region 二、定义一个学生类,有姓名,学号,年龄,同桌等特征,用学生类创建若干个学生
//Student s = new Student();
//s.name = "小明";
//s.id = 01;
//s.age = 8;
//Student s1 = new Student();
//s1.name = "小红";
//s1.id = 02;
//s1.age = 7;
//s.deskmate = s1;
//s1.deskmate = s;
//#endregion
//#region 三、定义一个班级类,有专业名称,教师容量,学生,创建一个班级对象
//Class c = new Class();
//c.name = "Unity";
//c.capacity = 99;
//c.students = new Student[] { s, s1 }; //两个学生
//#endregion
}
}
}
//内容用来记录学习