C#共有六种访问修饰符:public、private、protected、internal、protected internal、sealed

写到如今的代码,基本上只会使用public, private,有时候感觉相对于自己编程的年龄,许多知识点都缺少努力钻究的基本精神,总是坚持能用就行。真是汗颜……

特别在本文记录一下基本访问修饰符的知识。


访问修饰符         说明 
public 公有访问。不受任何限制。 
private 私有访问。只限于本类成员访问,子类,实例都不能访问。 
protected 保护访问。只限于本类和子类访问,实例不能访问。 
internal 内部访问。只限于本项目内访问,其他不能访问。 
protected internal 内部保护访问。只限于本项目或是子类访问,其他不能访问 
sealed      可以用来限制扩展性,如果密封了某个类,则其他类不能从该类继承


msdn的解释如下:internal指的是同一个程序集,内部成员和类型才是可以访问的.内部访问通常用于基于组件的开发,因为它使一组组件能够以私有方式进行合作,而不必向应用程序代码的其余部分公开

一个成员或类型只能有一个访问修饰符,使用 protectedinternal 组合时除外。

命名空间上不允许使用访问修饰符。命名空间没有访问限制。

根据发生成员声明的上下文,只允许某些声明的可访问性。如果在成员声明中未指定访问修饰符,则使用默认的可访问性。

不嵌套在其他类型中的顶级类型的可访问性只能是 internal 或 public。这些类型的默认可访问性是 internal。

嵌套类型是其他类型的成员,它们可以具有下表所示的声明的可访问性。


image.png

基础代码:

namespace asyncHelperTest
{
    class test
    {
        public void mainfun()
        {
            BaseClass c1 = new BaseClass();
            //这里声明类的实例后,实例对象可以调用访问成员函数1,5,4,见图2
        }
    }
    
    public class BaseClass
    {
        public string GetaPublicString1()
        {
            return "Public String";
        }
        protected string GetaProtectedString2()
        {
            return "Protected String";
        }
        private string GetaPrivateString3()
        {
            return "Private String";
        }
        internal string GetaInternalString4()
        {
            return "Internal String";
        }
        protected internal string GetaProtectedInternalString5()
        {
            return "Protected Internal String";
        }
        public void Test()
        {
            //这里可访问全部成员函数1,2,3,4,5,见图1
        }

    }
    
  class AClass:BaseClass
    {
        void test2()
        {
            //这里可以访问成员函数1,2,4,5,见图3
            //这里是继承基类BaseClass的,是它的子类
        }
    }
 }
 
=====另一个工程=================================
using asyncHelperTest;
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
             var c1 = new BaseClass();
             //这里直接声明另一个程序集的类BaseClass成员,可以访问成员函数1,见图5
        }
    }

    class FClass: BaseClass
    {
        private void test2()
        {
            //这里可以访问成员函数1,2,5,见图4
            //这里是另一个项目,也就是程序集和类BaseClass是不同的。
        }
    }
}


image.png

图1


image.png

图2


image.png

图3


image.png

图4


image.png

图5


最后一个话题是关于C#sealed 修饰符,它是指密封类,摘抄网络资料如下:

一、密封类

1. 密封类的定义

如果我们不希望自己编写的类被继承;如果有的类已经没有再被继承的必要,这时,我们可以使用sealed修饰符在类中进行声明,以达到该类不能派生其它类的目的,该类就被称为密封类。

2. 密封类与抽象类

密封类不能同时又是抽象类,因为密封类不能用作基类、也不能被继承,而抽象类总是希望被继承的。

3. 什么情况下使用密封类

需要阻止其它程序员无意中继承该类的时候;在程序运行时需要起到优化效果的时候,可以使用密封类。

4. 示例
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test
{
    class Program
    {
        sealed class A  // 密封类。不能从该类再派生出其它类
        {
            public int x;
            public int y;
        }
        static void Main(string[] args)
        {
            // C#密封类-www.baike369.com
            A a = new A();
            a.x = 10;
            a.y = 20;
            Console.WriteLine("x = {0}; y = {1}", a.x, a.y);
            Console.ReadLine();
        }
    }
}

运行结果:

x = 10; y = 20二、密封方法

1. 密封方法

对类中的方法可以使用sealed修饰符,我们称该方法为密封方法。

不是类的每个成员方法都可以作为密封方法,密封方法必须对基类的虚方法进行重载,提供具体的实现方法。所以,在方法的声明中,sealed修饰符总是和override修饰符同时使用,sealed修饰符位于override修饰符前面。

2. 示例
 
class A
{
    public virtual void F()
    {
        Console.WriteLine("A.F");
    }
    public virtual void G()
    {
        Console.WriteLine("A.G");
    }
}

class B : A
{
    sealed override public void F()
    {
        Console.WriteLine("B.F");
    }
    override public void G()
    {
        Console.WriteLine("B.G");
    }
}

class C : B
{
    override public void G()
    {
        Console.WriteLine("C.G");
    }
}

类B对基类A中的两个虚方法都进行了重载,其中F方法使用了sealed修饰符,成为一个密封方法。G方法不是密封方法,所以在B的派生类C中,可以重载方法G,但是不能重载方法F。


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864