C#访问修饰符教程展示了如何在C#中控制方法和成员字段的可见性。
访问修饰符设置方法和成员字段的可见性。C#有四种基本访问修饰符:public
、protected
、private
和内部
。public
成员可以从任何地方访问。protected
成员只能在类本身以及继承类和父类中访问。private
成员仅限于包含类型,例如仅在其类或接口中。internal
成员可以在同一程序集(exe或DLL)中访问。
还有两种修饰符的组合:protectedinternal
和privateprotected
。protectedinternal
类型或成员可以被声明它的程序集中的任何代码访问,或者从另一个程序集中的派生类中访问。privateprotected
类型或成员只能在其声明程序集中通过同一类中的代码或从该类派生的类型中访问。
访问修饰符防止数据被意外修改。它们使程序更加健壮。
类 | 当前程序集 | 派生类型 | 当前程序集中的派生类型 | 整个程序 | ||
---|---|---|---|---|---|---|
public | + | + | + | + | + | |
受保护 | + | o | + | + | o | |
内部 | + | + | o | o | o | |
私有 | + | o | o | o | o | |
内部保护 | + | + | + | + | o | |
私有保护 | + | o | o | + | o | o |
上表总结了C#访问修饰符(+可访问,o不可访问)。
C#访问修饰符示例
在下面的例子中,我们使用了public和private访问修饰符。
var p = new Person(); p.name = "Jane"; p.SetAge(17); Console.WriteLine($"{p.name} is {p.GetAge()} years old"); class Person { public string name; private int age; public int GetAge() { return this.age; } public void SetAge(int age) { this.age = age; } }
在上面的程序中,我们有两个成员字段。一个公开,另一个私有。
public int GetAge() { return this.age; }
如果成员字段是private
,访问它的唯一方法是viamethods。如果我们想在类外修改一个属性,该方法必须声明为public
。这是数据保护的一个重要方面。
public void SetAge(int age) { this.age = age; }
SetAge
方法使我们能够从类定义外部更改private
age变量。
var p = new Person(); p.name = "Jane";
我们创建了一个Person
类的新实例。因为name属性是public
,所以我们可以直接访问它。但是,不推荐这样做。
p.SetAge(17);
SetAge
方法修改年龄成员字段。它不能被直接访问或修改,因为它被声明为private
。
Console.WriteLine($"{p.name} is {p.GetAge()} years old");
最后,我们访问两个成员以构建一个字符串。
$ dotnet run Jane is 17 years old
C#访问修饰符示例二
具有private
访问修饰符的成员字段不会被派生类继承。
var derived = new Derived(); derived.info(); class Base { public string name = "Base"; protected int id = 5323; private bool isDefined = true; } class Derived : Base { public void info() { Console.WriteLine("This is Derived class"); Console.WriteLine("Members inherited"); Console.WriteLine(this.name); Console.WriteLine(this.id); // Console.WriteLine(this.isDefined); } }
在前面的程序中,我们有一个继承自Base
类的Derived
类。Base
类具有三个成员字段。都具有不同的访问修饰符。isDefined成员不是继承的。private
修饰符可以防止这种情况。
class Derived : Base
Derived
类继承自Base
类。为了从另一个类继承,我们使用冒号(:)运算符。
Console.WriteLine(this.name); Console.WriteLine(this.id); // Console.WriteLine(this.isDefined);
public
和protected
成员由Derived
类继承。可以访问它们。private
成员不被继承。访问成员字段的行被注释了。如果我们取消注释该行,代码将无法编译。
$ dotnet run ... warning CS0414: The field 'Base.isDefined' is assigned but its value is never used ... This is Derived class Members inherited Base 5323
在本文中,我们使用了C#访问修饰符。
列出所有C#教程。