Private 访问控制符的准确意义

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

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

<

时间: 2024-08-04 04:45:57

Private 访问控制符的准确意义的相关文章

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

假设我写了一个类,代码如下 namespace XXXXXXX{    public class A    {        private int Add(int a, int b)        {            return a + b;        }            }} 如果要单元测试A的Add 方法的话, 由于Add 是private 的, 单元测试代码无法直接访问,这时候,我们可以利用反射来作. 微软很多的bug也多数通过反射,访问private 属性或者字段可以

Java编程那些事儿64——访问控制符、修饰符和其它关键字

访问控制符的作用是说明被声明的内容(类.属性.方法和构造方法)的访问权限,就像发布的文件一样,在文件中标注机密,就是说明该文件可以被那些人阅读. 访问控制在面向对象技术中处于很重要的地位,合理的使用访问控制符,可以通过降低类和类之间的耦合性(关联性)来降低整个项目的复杂度,也便于整个项目的开发和维护.具体的实现就是通过访问控制符将类中会被其它类调用的内容开放出来,而把不希望别人调用的内容隐藏起来,这样一个类开放的信息变得比较有限,从而降低了整个项目开放的信息,另外因为不被别人调用的功能被隐藏起来

深入浅出OOP(五): C#访问修饰符(Public/Private/Protected/Internal/Sealed/Constants)

访问修饰符(或者叫访问控制符)是面向对象语言的特性之一,用于对类.类成员函数.类成员变量进行访问控制.同时,访问控制符也是语法保留关键字,用于封装组件. Public, Private, Protected at Class Level 在创建类时,我们需要考虑类的作用域范围,如谁可访问该类,谁可访问该类成员变量,谁可访问该类成员函数. 换而言之,我们需要约束类成员的访问范围.一个简单的规则,类成员函数.类成员变量之间可以自由 访问不受约束,这里主要说的是外部的访问约束.在创建class的时候,

Java编程那些事儿71——内部类简介

8.10 内部类(Inner Class) 内部类是Java语言中的一种特殊的语法,简单的来说,就是在一个类的内部再声明一个类,这些声明在类内部的类就被称作内部类.在实际声明时,内部类可以声明在类的内部.类的方法内部,也可以声明在类的构造方法内部,内部类声明的语法格式和一般类的声明一样,只是内部类声明时可以使用static修饰符进行修饰. 对于内部类的相关使用,本部分不做深入的介绍,只是进行简单的说明,辅助建立内部类的概念,能够进行一些基本的使用. 下面是一个简单的内部类的示例代码: /** *

java枚举

一.Enum 枚举类 1.枚举类和普通类的区别: 使用 enum 定义的枚举类 默认继承了 java.lang.Enum 类. 枚举类的构造器只能使用 private 访问控制符. 枚举类的所有实例必须在枚举类中显式列出(, 分隔 ; 结尾). 列出的实例系统会自动添加 public static final 修饰. 2.注意 a.必须在枚举类的第一行声明枚举类对象. b.JDK 1.5 中可以在 switch 表达式中使用Enum 定义的枚举类的对象作为表达式, case 子句可以直接使用枚举

java的访问权限控制

访问控制(或隐藏具体实现)与"最初的实现并不恰当"有关 访问控制符的等级,从最大权限到最小权限依次为:public.protected.包访问权限(没有关键词).private 1.包:库单元 package 包内包含有一组类,它们在单一的名字空间之下被组织在了一起. import关键字:如果要导入单一的类 import java.util.ArrayList 想要导入其下所有的类 import java.util.* 包机制:为了解决名字空间.名字冲突 当编写一个Java源代码文件时

C#的基类和访问修饰符

C#的基类和访问修饰符 一. C#的基类System. Object 在面向对象编程过程中,所有的类都是超级父类System. Object类的子类.所有的类都自动继承System. Object,自然也就继承了System. Object类的所有方法,System. Object包含的方法有: public static bool Equals(object objA,object objB){}    public static bool ReferenceEquals(object obj

Java类的访问权限

问题描述 在定义类的时候,有两种选择:publicclasshasPublic{...}classnoPublic{...} 两种访问权限的类分别是:public的,允许所有类使用:而默认包访问权限的类只能被同包内的类使用.在这里我有两个问题:(1)noPublic类是默认包访问权限,也就是说,同一个包内其他类可以使用noPublic.那么,noPublic类是随时可以被使用的吗?(2)关于第一个问题,我认为noPublic类必须也被编译并生成单独的.class文件时,java解释器才有可能找到

Java中的访问修饰符详细解析_java

1.类的修饰符分为:可访问控制符和非访问控制符两种. 可访问控制符是:公共类修饰符 public 非访问控制符有:抽象类修饰符 abstract :最终类修饰符 final 1 )公共类修饰符 public : Java 语言中类的可访问控制符只有一个: public 即公共的.每个 Java 程序的主类都必须是 public 类作为公共工具供其它类和程序使用的应定义为 public 类. 2 )抽象类修饰符 abstract :凡是用 abstract 修饰符修饰的类,被称为抽象类.所谓抽象类