艾伟: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:实现高弹性的电商订单系统
基于消息队列以及函数计算,快速部署一个高弹性的商品订单系统,能够应对抢购场景下的高并发情况。
云安全基础课 - 访问控制概述
课程大纲 课程目标和内容介绍视频时长 访问控制概述视频时长 身份标识和认证技术视频时长 授权机制视频时长 访问控制的常见攻击视频时长
目录
相关文章
|
5月前
|
安全 数据安全/隐私保护 C++
C++一分钟之-成员访问控制:public, private, protected
【6月更文挑战第20天】C++的成员访问控制涉及`public`、`private`和`protected`,影响类成员的可见性和可访问性。`public`成员对外公开,用于接口;`private`成员仅限类内部,保护数据安全;`protected`成员在派生类中可访问。常见问题包括不恰当的访问级别选择、继承中的访问权限误解及过度使用友元。通过示例展示了如何在派生类中访问`protected`成员。正确使用访问修饰符能确保代码的封装性、安全性和可维护性。
176 4
|
Java 数据安全/隐私保护
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=
1524 0
|
24天前
|
网络协议 网络虚拟化 数据安全/隐私保护
访问控制列表(ACL)配置
访问控制列表(ACL)配置
访问控制列表(ACL)配置
|
27天前
|
网络协议 安全 网络安全
Cisco-命名ACL访问控制列表
Cisco-命名ACL访问控制列表
|
27天前
|
安全 网络协议 网络安全
Cisco-扩展ACL访问控制列表
Cisco-扩展ACL访问控制列表
|
27天前
|
安全 网络安全 数据安全/隐私保护
Cisco-标准ACL访问控制列表
Cisco-标准ACL访问控制列表
ly~
|
2月前
|
消息中间件 搜索推荐 大数据
一般情况下在 RocketMQ 中添加 access key 的步骤: 一、确定配置文件位置 RocketMQ 的配置文件通常位于安装目录下的 conf 文件夹中。你需要找到 broker.conf 或相关的配置文件。 二、编辑配置文件 打开配置文件,查找与 ACL(访问控制列表)相关的配置部分。 在配置文件中添加以下内容:
大数据广泛应用于商业、金融、医疗和政府等多个领域。在商业上,它支持精准营销、客户细分及流失预测,并优化供应链管理;金融领域则利用大数据进行风险评估、市场预测及欺诈检测;医疗行业通过大数据预测疾病、提供个性化治疗;政府运用大数据进行城市规划和公共安全管理;工业领域则借助大数据进行设备维护、故障预测及质量控制。
ly~
75 2
|
6月前
|
安全 网络安全 数据安全/隐私保护
【专栏】IT 知识百科:访问控制列表(ACL)是网络安全的关键机制,用于定义和管理网络资源的访问权限
【4月更文挑战第28天】访问控制列表(ACL)是网络安全的关键机制,用于定义和管理网络资源的访问权限。ACL工作原理包括定义规则、匹配规则和执行操作。标准ACL基于源IP过滤,扩展ACL则提供更多筛选条件。时间及用户基础的ACL提供更细化的控制。优点在于增强安全性和精细管理,但管理复杂性和性能影响也是挑战。未来,ACL将趋向智能化和自动化,与更多安全技术结合,以提升网络安全。**
394 0
|
3月前
|
安全 Linux 数据库
|
3月前
|
网络安全 数据安全/隐私保护 网络架构