首页 > 编程语言 >C# 学习笔记 - 封装

C# 学习笔记 - 封装

时间:2023-07-03 13:55:32浏览次数:35  
标签:封装 string C# 笔记 class Person internal public name

封装

封装可以阻止用户以开发者不希望的方式操纵对象。

所有类和结构体的默认受保护级别为“private”,这意味着外部用户无法访问类和结构体的内部成员。

受保护级别(Protection Levels)

Private

private 级别的成员只能在类的内部被访问,其他类的方法,甚至 private 级别成员所在类的衍生类均无法访问 private 级别的成员。private 是默认的受保护级别。

namespace PrivateSample
{
    public class Person
    {
        private string _name;

        // Methods
        public Person(string name)
        {
            // Private members can only be modified by the internal methods or constructors of class
            this._name = name; 
        }
    }

    public class Entry
    {
        static void Main(string[] args)
        {
            Person OnePerson = new Person("Samanta");
            //OnePerson._name = "Sam"; // This causes a error of access level
        }
    }
}

Protected

protected 级别的成员可以被类自身或者类的衍生类访问,但不能被其他类访问。

namespace ProtectedSample
{
    public class Person
    {
        protected string _name;
    }
    /// <summary>
    /// When a class inherits from other class, it can access your protected and public members
    /// above your created members
    /// </summary>
    public class Warrior : Person
    {
        public void SetName(string name)
        {
            // Protected members can be accessed by internal methods or constructors of class
            // so, it can be accessed by inherit class too
            base._name = name;
        }
    }

    public class Entry
    {
        static void Main(string[] args)
        {
            Warrior OnePerson = new Warrior();
            OnePerson.SetName("Glades"); // OK
            // OnePerson._name = "Sam"; // This causes a error of access level too
            // protected members can not be accessed by external scopes
        }
    }
}

Public

public 级别的成员可以被任何类中的任何方法访问。

namespace PublicSample
{
    public class Person
    {
        public string Name;
    }

    public class Entry
    {
        static void Main(string[] args)
        {
            Person BeautifulPerson = new Person();
            BeautifulPerson.Name = "Debora"; // OK, public member can be accessed by other scopes
        }
    }
}

注:将成员变量暴露给外部不是一个好的编程习惯(除非必须这么做)。

It is good programming practice not to expose member variables to the outside, unless it is necessary. This is true especially for fields that should only be accessible over accessor and mutator methods (getters and setters). Exceptions are member variables that are constant.

Internal

internal 级别的成员只能在相同的程序集中被访问。

namespace InternalSample
{
    public class Person
    {
        internal string Name;
    }

    public class Entry
    {
        static void Main(string[] args)
        {
            Person BeautifulPerson = new Person();
            BeautifulPerson.Name = "Debora"; // OK, internal member can be accessed by other 
            // scopes in same assembly supposing that Person is in another assembly, by example a 
            // library, the name cannot be accessed. In another assembly source, this causes an error:
            // BeautifulPerson.Name = "Debora"; // Cannot access internal member
        }
    }
}

Protected Internal

protected internal 级别的成员可以被同一程序集下的类及其衍生类访问。

namespace InternalSample
{
    public class Person
    {
        protected internal string Name;
    }

    public class Entry
    {
        static void Main(string[] args)
        {
            Person BeautifulPerson = new Person();
            BeautifulPerson.Name = "Debora"; // As above...
        }
    }
}

public class Book : InternalSample.Person
{
    static void Main(string[] args)
    {
        InternalSample.Person BeautifulPerson = new InternalSample.Person();
        string aName = BeautifulPerson.Name; // Can be accessed, as Book is derived from Person
    }
}

范围比较:

  • private < internal < public

  • private < protected < public

proctected : 决定衍生类是否有访问权限

internal : 决定程序集是否有访问权限

img

标签:封装,string,C#,笔记,class,Person,internal,public,name
From: https://www.cnblogs.com/snoopy1866/p/17522579.html

相关文章

  • BOSHIDA DC电源模块在自动化设备的详细应用
    BOSHIDADC电源模块在自动化设备的详细应用DC电源模块是自动化设备中经常使用的电源设备,它可以将交流电转换成稳定的直流电,以满足自动化设备的电能需求。以下是DC电源模块在自动化设备中的详细应用: 1.逆变器控制器:DC电源模块可以作为逆变器控制器的电源,为其提供稳定的直流电......
  • C语言(1)
    目录1.数据类型1.1基本类型1.2构造类型1.3指针类型1.4空类型(void)2.变量和常量2.1C语言中常量的表示方式2.2数据在内存中的存储2.3C语言中变量的表示方式2.3.1变量的定义2.3.2变量的含义3.整数之间的赋值问题3.1长的赋值给短的3.2短的赋值给长的4.运算符与表达式4.1运算符的分类4.2......
  • BOSHIDA DC电源模块该如何选择
    BOSHIDADC电源模块该如何选择 选择DC电源模块时应考虑以下几个方面:1.输出电压和电流:根据需要确定所需的输出电压和电流,以确保满足被供电设备的电力需求。2.负载特性:确定被供电设备的负载特性,例如是否有起始电流等,这些特性将影响到所选的DC电源模块的最小电流和起始能......
  • Fedora CoreOS:一种传统的安装到裸金属的方式
    官方及网上的资料,都是教你通过转换配置文件,并植入到安装过程方式。其实,我们完全可以按照正规、传统的方式来把FedoraCoreOS安装到裸机上。废话不多说,如下操作: step1:下载isolive安装镜像step2:使用下载的isolive安装镜像启动裸金属服务器step3:在isolive系统下(自动......
  • Apache与Tomcat比较联系
    一Apache与Tomcat比较联系apache支持静态页,tomcat支持动态的,比如servlet等。一般使用apache+tomcat的话,apache只是作为一个转发,对jsp的处理是由tomcat来处理的。apache可以支持php\cgi\perl,但是要使用java的话,你需要tomcat在apache后台支撑,将java请求由apache转发给tomcat处理。a......
  • Apache FtpServer Spring3 整合
    配置运行成功,以备遗忘。Spring配置当中加入 <importresource="applicationFTP.xml"/>在Spring配置同级目录创建 applicationFTP.xml<?xmlversion="1.0"encoding="UTF-8"?><serverxmlns="http://mina.apache.org/ftpserver/spring/v1"  ......
  • BOSHIDA DC电源模块在自动化设备中的应用
    BOSHIDADC电源模块在自动化设备中的应用DC电源模块是一种用于提供电源的设备,可以将交流电转换为直流电,并提供稳定、可靠的电源输出。在自动化设备中,DC电源模块常用于驱动直流电机、控制电磁阀等各种设备。以下是DC电源模块在自动化设备中的应用:1.电动机驱动:DC电源模块可以为直......
  • C语言(二)
    目录6.数组6.1数组的概念6.2一维数组6.3排序问题6.3.1插入排序6.3.2冒泡排序6.3.3选择排序6.4二分查找6.5字符数组6.6二维数组6.数组6.1数组的概念一组具有相同类型,相同含义的数据类型的有序集合。数组不是基本类型,是构造类型。数组的本质/数组的存储方式:一片地址连续的空间......
  • CCF CAT
    题面BestTravelPlans枚举在哪个城市停止旅行,这样我们在路程上花费的时间就确定了,同时确定了在活动上花费的时间对于活动花费的时间,我们贪心选择每一秒的最优值即可#include<bits/stdc++.h>usingll=longlong;intmain(){ std::ios::sync_with_stdio(false);......
  • tensorflow—CPU版安装教程
    一、创建TensorFlow虚拟环境(这里还没有进行安装)检测目前创建了哪些环境:condainfo--envs 创建虚拟环境:condacreate--nametensorflow(可以自己命名) python=3.8创建虚拟环境如下图所示:  此时激活自己创建的虚拟环境即可:activate(环境名称)二、安装TensorFlow清华......