📅  最后修改于: 2023-12-03 14:40:30.357000             🧑  作者: Mango
封装是面向对象编程的三大特性之一,其目的是保护数据,并隐藏数据的实现细节,同时提供特定的访问接口。在C#中,封装主要通过访问修饰符来实现,包括public、private、protected和internal。
public是最常用的访问修饰符,表示对外公开的接口,可以在任何地方访问。例如:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
在上面的代码中,Name和Age是public的,可以在该类的任何实例中访问。
private是最严格的访问修饰符,表示只能在当前类中访问,类外部无法访问。例如:
public class Person
{
private string Name { get; set; }
private int Age { get; set; }
public void SetName(string name)
{
Name = name;
}
public void SetAge(int age)
{
Age = age;
}
}
在上面的代码中,Name和Age是private的,只能在Person类中使用。如果想要对Name和Age进行赋值或者获取,需要使用SetName和SetAge方法。
protected表示只能在当前类或该类的子类中访问。例如:
public class Person
{
protected string Name { get; set; }
protected int Age { get; set; }
}
public class Employee : Person
{
public void ModifyName()
{
Name = "New Name";
}
}
在上面的代码中,Employee类继承了Person类,所以可以在Employee类中访问Person类的protected成员,但是在其他类中无法访问。
internal表示只能在当前程序集中访问。例如:
internal class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
public class Employee
{
public void SetPersonName(Person person, string name)
{
person.Name = name;
}
}
在上面的代码中,Person类是internal的,只能在当前程序集中访问。在Employee类中,可以通过SetPersonName方法访问Person类中的Name属性。
public class Person
{
private string _name;
private int _age;
public Person(string name, int age)
{
_name = name;
_age = age;
}
public string GetName()
{
return _name;
}
public void SetName(string name)
{
_name = name;
}
public int GetAge()
{
return _age;
}
public void SetAge(int age)
{
_age = age;
}
}
在上面的代码中,Person类中的_name和_age是private的,只能通过GetName和GetAge方法获取。SetName和SetAge方法可以用于设置_name和_age的值。这种封装方式可以保护_name和_age,同时提供了对外的访问接口。