C#基础知识 2:基本语法
2.6 访问修饰符
访问修饰符 用于控制类、方法、属性和其他成员的可见性和访问权限。C# 提供了几种访问修饰符,包括 public
、private
、protected
、internal
和 protected internal
。以下是访问修饰符的详细讲解,包括其优点、缺点以及代码示例。
2.6.1 访问修饰符的基本概念
访问修饰符决定了其他代码可以访问类、方法、属性等成员的程度。C# 提供以下访问修饰符:
- public:成员对所有代码都可见。
- private:成员仅对定义它的类可见。
- protected:成员对定义它的类及其派生类可见。
- internal:成员对定义它的程序集可见。
- protected internal:成员对定义它的程序集及其派生类可见。
示例:
csharp
public class Person
{
public string Name { get; set; } // 公共属性
private int age; // 私有字段
protected string Address { get; set; } // 受保护属性
internal string Email { get; set; } // 内部属性
protected internal string PhoneNumber { get; set; } // 受保护内部属性
}
2.6.2 访问修饰符的声明和使用
访问修饰符声明 在成员声明前添加访问修饰符。
示例:
csharp
public class Person
{
public string Name { get; set; } // 公共属性
private int age; // 私有字段
protected string Address { get; set; } // 受保护属性
internal string Email { get; set; } // 内部属性
protected internal string PhoneNumber { get; set; } // 受保护内部属性
}
访问修饰符使用 根据访问修饰符的权限,控制成员的访问。
示例:
csharp
class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.Name = "Alice"; // 可以访问公共属性
// person.age = 30; // 错误:无法访问私有字段
// person.Address = "123 Main St"; // 错误:无法访问受保护属性
person.Email = "alice@example.com"; // 可以访问内部属性
person.PhoneNumber = "123-456-7890"; // 可以访问受保护内部属性
}
}
2.6.3 访问修饰符的优点
-
封装:
- 通过访问修饰符,可以控制对类成员的访问,提高数据的安全性。
- 避免外部代码直接修改类的内部状态。
-
代码重用:
- 访问修饰符允许在不同类和程序集之间共享代码,提高代码的可重用性。
- 通过
internal
和protected internal
,可以在同一程序集或派生类中重用代码。
-
模块化:
- 访问修饰符帮助将代码分解为模块,便于管理和维护。
- 每个模块可以独立开发和测试。
-
提高可读性:
- 通过访问修饰符,可以清晰地表示类成员的可见性和用途。
- 代码更易于理解和阅读。
-
多态性:
- 通过
protected
和protected internal
,可以在派生类中扩展和重用现有类的功能。 - 提高代码的灵活性和可扩展性。
- 通过
2.6.4 访问修饰符的缺点
-
复杂性增加:
- 对于小型项目,使用访问修饰符可能会增加不必要的复杂性。
- 需要额外的时间来设计和管理访问权限。
-
学习曲线:
- 对于初学者,理解访问修饰符的概念和使用方法可能需要一些时间。
-
性能开销:
- 访问修饰符的检查可能会带来一定的性能开销,尤其是在性能敏感的应用中。
-
内存消耗:
- 访问修饰符的管理可能会占用一定的内存,可能导致内存消耗增加。
2.6.5 访问修饰符的代码示例
以下是一些详细的代码示例,展示了如何声明和使用访问修饰符。
示例1:公共访问修饰符
文件1:Person.cs
csharp
public class Person
{
public string Name { get; set; } // 公共属性
}
文件2:Program.cs
csharp
using System;
class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.Name = "Alice"; // 可以访问公共属性
Console.WriteLine($"Name: {person.Name}");
}
}
示例2:私有访问修饰符
文件1:Person.cs
csharp
public class Person
{
private string name; // 私有字段
public string Name
{
get { return name; }
set { name = value; }
}
}
文件2:Program.cs
csharp
using System;
class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.Name = "Bob"; // 可以通过公共属性访问私有字段
Console.WriteLine($"Name: {person.Name}");
// person.name = "Charlie"; // 错误:无法访问私有字段
}
}
示例3:受保护访问修饰符
文件1:Person.cs
csharp
public class Person
{
protected string Address { get; set; } // 受保护属性
}
文件2:Employee.cs
csharp
public class Employee : Person
{
public void SetAddress(string address)
{
Address = address; // 可以在派生类中访问受保护属性
}
public string GetAddress()
{
return Address; // 可以在派生类中访问受保护属性
}
}
文件3:Program.cs
csharp
using System;
class Program
{
static void Main(string[] args)
{
Employee employee = new Employee();
employee.SetAddress("123 Main St");
Console.WriteLine($"Address: {employee.GetAddress()}");
// employee.Address = "456 Elm St"; // 错误:无法在非派生类中访问受保护属性
}
}
示例4:内部访问修饰符
文件1:Person.cs
csharp
internal class Person
{
internal string Email { get; set; } // 内部属性
}
文件2:Program.cs
csharp
using System;
class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.Email = "alice@example.com"; // 可以在同一个程序集中访问内部属性
Console.WriteLine($"Email: {person.Email}");
}
}
示例5:受保护内部访问修饰符
文件1:Person.cs
csharp
public class Person
{
protected internal string PhoneNumber { get; set; } // 受保护内部属性
}
文件2:Employee.cs
csharp
public class Employee : Person
{
public void SetPhoneNumber(string phoneNumber)
{
PhoneNumber = phoneNumber; // 可以在派生类中访问受保护内部属性
}
public string GetPhoneNumber()
{
return PhoneNumber; // 可以在派生类中访问受保护内部属性
}
}
文件3:Program.cs
csharp
using System;
class Program
{
static void Main(string[] args)
{
Employee employee = new Employee();
employee.SetPhoneNumber("123-456-7890");
Console.WriteLine($"Phone Number: {employee.GetPhoneNumber()}");
// employee.PhoneNumber = "987-654-3210"; // 错误:无法在非派生类中访问受保护内部属性
}
}
通过以上详细讲解和代码示例,您可以更好地理解和使用C#中的访问修饰符。访问修饰符是控制类成员可见性和访问权限的重要工具,有助于提高代码的安全性、可重用性和可维护性。