C#成员变量和访问修饰符

一、成员变量(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


        }
    }
}

//内容用来记录学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值