谈谈C#的私有成员的一个有趣的现象!

大家都知道,一个类的私有成员只能在他的内部访问!

但是不知道大家注意到没有,实际上在C#中一个类的实例是可以访问同一个类的另外一个实例的私有成员的。

请看这段简单的代码

public class MyClass
    {
        private int i = 0;

        public void Function()
        {
            MyClass a = new MyClass();
            Console.WriteLine( a.i);  //这里成功访问了另外的一个实例a的私有实例字段

        }

     }

大家也可以自己写一段类似的代码来测试一下,的确是可以访问另外一个实例的私有成员!

为什么呢 因为C#就是一开始就是这样设计的。实际上这个设计在某种程度上破坏了对象的封装性,其他的面向对象的语言可能就没有做这样的设计了。

希望大家可以注意到这个问题,为了保证对象良好的封装性,最好不要这样访问啊!

时间: 2024-11-02 12:44:50

谈谈C#的私有成员的一个有趣的现象!的相关文章

发现一个有趣的现象,互联网公司开始集体农村刷墙

最近,发现一个有趣的现象,互联网公司开始集体农村刷墙.淘宝.京东.360.易信.当当.世纪佳缘--纷纷"上山下乡".而且,一个比一个有意思.比如淘宝的"要想生活好,赶紧上淘宝",当当的"老乡见老乡,购物上当当",世纪佳缘的"上佳缘找媳妇儿,种地有帮手"-- 围观之余,有一个问题,为什么热衷于"互联网思维"的这些公司愿意"上山下乡"?真的只是单纯地想弄个噱头,炒一把么?当然不是!想炒作,社

一个有趣的现象(苹果的bug Or 坑?),关于区分真机和模拟器的预编译宏

TARGET_IPHONE_SIMULATOR和TARGET_OS_IPHONE 是苹果的两个宏定义, 在真机sdk中位于ios->usr/include/targetconditionals.h中, 在模拟器sdk中位于simulator->usr/include/targetconditionals.h中 (笔者此时使用的xcode版本为5.1,sdk版本是7.1) 仔细看其模拟器sdk中的定义:     #define TARGET_OS_IPHONE            1    

firebug的一个有趣现象介绍_javascript技巧

复制代码 代码如下: var obj = {length:0,splice:function(){}} console.log(obj) 猜猜上面会打印出啥? 没错,打印出来的看起来是一个空数组... 在FIREBUG里如果一个对象同时拥有length属性和splice方法,就会被firebug显示为数组的形式... 如果以前注意过的话就会发现JQUERY就是这么写的,通过选择器打印出来的看起来跟数组一样. 一直以来我都很好奇为毛返回的数组,但是却有数组根本没有的方法,也没有数组该有的方法,比如

三大关系数据库字段值超长的一个有趣对比

三大关系数据库字段值超长的一个有趣对比   在开发中,我们可能会遇到插入字段值超长的情况,前阵子遇到这样一个案例,结果一对比后发现一个有趣的现象,如果插入字段值超长,ORACLE.SQL Server.MySQL它们会提示那个字段值超长吗?下面看看实验吧:   ORACLE数据库   SQL> create table test(id number(10), name varchar2(12));   Table created.   SQL> insert into test   2  se

c++-C++类的私有成员中定义了一个数组,怎么在构造函数中初始化这个数组?

问题描述 C++类的私有成员中定义了一个数组,怎么在构造函数中初始化这个数组? 写了这样一个类: class Base{ private: int r[MAX_SIZE]; int length; public: Base() { r[MAX_SIZE] = {1,2,0,5,8,9,7,3,6,4}; //编译的时候在这边出错 length = 10; } void swap_data(int,int); void Show(const Base &ob); friend int Bubble

定义一个分数类,分子分母各为私有成员,

/*定义一个分数类,分子分母各为私有成员, 规则:默认构造函数分数为1 分子分母要以最简形式存放.如3/9=1/3 定义成员Add,Sub,Mul和Div计算结果仍以最简形式存放 以浮点形式打印分数 思路:问题1.如何对分数约分.分子分母各除以他们的最大公约数 问题2.加减乘除运算 加:通分后加结果再约分 减:通分后减结果再约分 乘:分子乘以分子,分母乘以分母,然后约分. 除:除就等于乘以一个数的倒数. 问题3.浮点式打印 分子除以分母*/ #include <iostream> using

C#箴言之用属性来访问类的私有成员

访问|来访 在程序中,难免要访问某个对象的私有成员.那么以前实现这类功能的方法有两种,第一种方法最简单,就是把成员访问符从"private"改为"public"即可:而另一个就是提供公有的成员访问函数来进行访问.那么现在用C#编写程序,就不再需要采用前面所说的两种方法了,而直接使用属性来完成. 首先来看看三种方法的如何实现以及调用的,这里用一个例子来说明,即访问"EmployeeInfo"类的私有成员strName,具体如下表格所示.   pri

公有成员和私有成员

Flash MX 2004 的类成员里面有公有成员和私有成员的区别,那么我们应该怎样应用和区分它们呢,这里有几个简单的例子来帮助您了解. 如果不特别指定,类里所有的成员都是公有(Public)的,不用特地声明.但是私有(Private)成员则是要一定声明的. 如果成员是公有的,那么就可以被主类以及 Flash 调用.如果成员是私有的,那么则只可以通过主类来访问.我们下面看一个例子,它有一个私有方法 ShowSomething(). class Show {private function Sho

C++中用#define访问类的私有成员

我们知道,类的私有成员在类的外部是不能被访问的. 例如有下面的这个简单的类: class ClxECS{private:int iPrivate;}; 那么下面的这个函数是不能通过编译的: void ECS_test(){ClxECS lx;lx.iPrivate = 13; cout << lx.iPrivate << endl;} 但是,我们并不是没有办法来访问类的私有成员. 其实,方法很简单,只要在类的声明前面加上如下一行代码就行了: #define private publ