艾伟:Private 访问控制符的准确意义

本文涉及的产品
访问控制,不限时长
简介: 假设我写了一个类,代码如下namespace XXXXXXX{    public class A    {        private int Add(int a, int b)        {            return a + b;        }            }}...

假设我写了一个类,代码如下


namespace  XXXXXXX
{
    
public class A
    
{
        
private int Add(int a, int b)
        
{
            
return a + b;
        }

        
    }

}


如果要单元测试A的Add 方法的话, 由于Add 是private 的, 单元测试代码无法直接访问,这时候,我们可以利用反射来作. 微软很多的bug也多数通过反射,访问private 属性或者字段可以fix

VS 2005 自动生成的单元测试代码

       [DeploymentItem( " XXXXXXX.exe " )]
        [TestMethod()]
        
public   void  AddTest()
        
{
            A target 
= new A();

            TestProject1.XXXXXXX_AAccessor accessor 
= new TestProject1.XXXXXXX_AAccessor(target);

            
int a = 0// TODO: Initialize to an appropriate value

            
int b = 0// TODO: Initialize to an appropriate value

            
int expected = 0;
            
int actual;

            actual 
= accessor.Add(a, b);

            Assert.AreEqual(expected, actual, 
"XXXXXXX.A.Add did not return the expected value.");
            Assert.Inconclusive(
"Verify the correctness of this test method.");
        }


而这里的XXXXXXX_AAccessor就是一个wrapper 来通过反射调用对象的方法,代码如下

[System.Diagnostics.DebuggerStepThrough()]
[System.CodeDom.Compiler.GeneratedCodeAttribute(
" Microsoft.VisualStudio.TestTools.
    UnitTestGeneration
" " 1.0.0.0 " )]
internal   class  XXXXXXX_AAccessor : BaseAccessor  {
    
    
protected static Microsoft.VisualStudio.TestTools.UnitTesting.PrivateType m_privateType =
      new
 Microsoft.VisualStudio.TestTools.UnitTesting.PrivateType(typeof(global::XXXXXXX.A));
    
    
internal XXXXXXX_AAccessor(global::XXXXXXX.A target) : 
            
base(target, m_privateType) {
    }

    
    
internal int Add(int a, int b) {
        
object[] args = new object[] {
                a,
                b}
;
        
int ret = ((int)(m_privateObject.Invoke("Add"new System.Type[] {
                    
typeof(int),
                    
typeof(int)}
, args)));
        
return ret;
    }

}


这时候,有些人可能又疑惑,为啥private 的东西最终还是可以调用,起到封装的目的了吗?

..................... 

问题2: private 的到底是什么意思,我特意浏览了一下C#语言规范.

一个成员的可访问域由可能是不连续的程序文本节组成从那里可以访问该成员。出于定义成员可访问域的目的,如果成员不是在某个类型内声明的,就称该成员是顶级的;如果成员是在其他类型内声明的,就称该成员是嵌套的。此外,程序的程序文本定义为包含在该程序的所有源文件中的全部程序文本,而类型的程序文本定义为包含在该类型(可能还包括嵌套在该类型内的类型)的“类体”、“结构体”、“接口体”或“枚举体”中的开始和结束(“{”和“}”)标记之间的全部程序文本。

对于Private

·         如果 M 的已声明可访问性为 private M 的可访问域是 T 的程序文本。

为此他还列举了一个例子:

class  A
{
    
int x;
    
static void F(B b) {
        b.x 
= 1;    // Ok,这里x事实上是private 的变量
    }

}

class  B: A
{
    
static void F(B b) {
        b.x 
= 1;        // Error, x not accessible
    }

}


那反射呢? 反射可以不遵守嘛?呵呵,一会儿给出个完整的解释.

相关实践学习
消息队列+Serverless+Tablestore:实现高弹性的电商订单系统
基于消息队列以及函数计算,快速部署一个高弹性的商品订单系统,能够应对抢购场景下的高并发情况。
云安全基础课 - 访问控制概述
课程大纲 课程目标和内容介绍视频时长 访问控制概述视频时长 身份标识和认证技术视频时长 授权机制视频时长 访问控制的常见攻击视频时长
目录
打赏
0
0
0
0
52
分享
相关文章
C++一分钟之-成员访问控制:public, private, protected
【6月更文挑战第20天】C++的成员访问控制涉及`public`、`private`和`protected`,影响类成员的可见性和可访问性。`public`成员对外公开,用于接口;`private`成员仅限类内部,保护数据安全;`protected`成员在派生类中可访问。常见问题包括不恰当的访问级别选择、继承中的访问权限误解及过度使用友元。通过示例展示了如何在派生类中访问`protected`成员。正确使用访问修饰符能确保代码的封装性、安全性和可维护性。
296 4
Java包及访问控制权限--(private/default/protected/public)及命名规范
<h1>1、访问控制权限</h1> <div> <img src="http://img.blog.csdn.net/20131010145930187" alt=""><br> </div> <div> <img src="http://img.blog.csdn.net/20131010150004125" alt=""><br> </div> <div> <pre name=
1541 0
访问控制列表(ACL)是网络安全中的一种重要机制,用于定义和管理对网络资源的访问权限
访问控制列表(ACL)是网络安全中的一种重要机制,用于定义和管理对网络资源的访问权限。它通过设置一系列规则,控制谁可以访问特定资源、在什么条件下访问以及可以执行哪些操作。ACL 可以应用于路由器、防火墙等设备,分为标准、扩展、基于时间和基于用户等多种类型,广泛用于企业网络和互联网中,以增强安全性和精细管理。
512 7
访问控制列表(ACL)是网络安全管理的重要工具,用于定义和管理网络资源的访问权限。
访问控制列表(ACL)是网络安全管理的重要工具,用于定义和管理网络资源的访问权限。ACL 可应用于路由器、防火墙等设备,通过设定规则控制访问。其类型包括标准、扩展、基于时间和基于用户的ACL,广泛用于企业网络和互联网安全中,以增强安全性、实现精细管理和灵活调整。然而,ACL 也存在管理复杂和可能影响性能的局限性。未来,ACL 将趋向智能化和自动化,与其他安全技术结合,提供更全面的安全保障。
227 4
了解访问控制列表 (ACL):概念、类型与应用
了解访问控制列表 (ACL):概念、类型与应用
211 2
对比了思科和华为网络设备的基本配置、接口配置、VLAN配置、路由配置、访问控制列表配置及其他重要命令
本文对比了思科和华为网络设备的基本配置、接口配置、VLAN配置、路由配置、访问控制列表配置及其他重要命令,帮助网络工程师更好地理解和使用这两个品牌的产品。通过详细对比,展示了两者的相似之处和差异,强调了持续学习的重要性。
130 2