`
beeyon
  • 浏览: 23256 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

C# 的封装性

    博客分类:
  • C#
阅读更多

今天看了java的封装性,突然就想到了C#的封装性,怎么样写代码才不违反封装性呢?

 public class TestClass
    {
       

        public static void Main(string[] args)
        {
            Test t = new Test();
            TestA d = t.D;
            Console.WriteLine("t.D=" + t.D.Name);
            Console.WriteLine("d=" + d.Name);
            d.change("beeyon chen");
            Console.WriteLine("change d value after....");
            Console.WriteLine("t.D=" + t.D.Name);
            Console.WriteLine("d=" + d.Name);
            Console.ReadKey();
        }
    }
    class Test
    {
        private TestA d;

        public TestA D
        {
            get
            {
                
                return d;
            }
        }
        public Test()
        {
            this.d = new TestA();
        }
    }
    class TestA 
    {
        private string name;
        public string Name
        {
            get { return name; }
        }
        public TestA()
        {
            this.name = "beeyon";
        }
        public string change(string name)
        {
            this.name = name;
            return this.name;
        }

       
    }

 在Test中为了保护Test中的类对象 d ,我们只有设置了get 用来获取d

在main 方法中我们可以看到输出的内容为,红色中的t.D值也改变了,这样就破坏了封装性

t.D=beeyon

d=beeyon

change d value after....

t.D=beeyon chen  

d=beeyon chen

 

因为d = t.D 引用了同一个对象,所以d改变了同一个对象的值.

 

如果TestA 实现了ICloneable 接口,那就有可以自己实现Clone一个新的对象

 public class TestClass
    {
       

        public static void Main(string[] args)
        {
            Test t = new Test();
            TestA d = t.D;
            Console.WriteLine("t.D=" + t.D.Name);
            Console.WriteLine("d=" + d.Name);
            d.change("beeyon chen");
            Console.WriteLine("change d value after....");
            Console.WriteLine("t.D=" + t.D.Name);
            Console.WriteLine("d=" + d.Name);
            Console.ReadKey();
        }
    }
    class Test
    {
        private TestA d;

        public TestA D
        {
            get
            {
                return (TestA)d.Clone();
            }
        }
        public Test()
        {
            this.d = new TestA();
        }
    }
    class TestA : ICloneable
    {
        private string name;
        public string Name
        {
            get { return name; }
        }
        public TestA()
        {
            this.name = "beeyon";
        }
        public string change(string name)
        {
            this.name = name;
            return this.name;
        }

        #region ICloneable 成员

        public object Clone()
        {
            TestA a = (TestA)this.MemberwiseClone();
            return a;
        }

        #endregion
    }
 

输出的内容

t.D=beeyon

d=beeyon

change d value after...

t.D=beeyon

d=beeyon chen



 

分享到:
评论

相关推荐

    C# 封装COM组件源码

    本篇将详细介绍如何使用C#封装COM组件,并提供C++调用的解决方案。 标题中的"C# 封装COM组件源码"指的是创建一个C#项目,将其暴露为COM接口,以便非托管的C++代码可以调用。下面我们将详细讲解这个过程: 1. **...

    C# 封装的Chrome 浏览器

    本项目涉及的是利用C#封装Chrome浏览器,从而创建一个可以在桌面应用程序中嵌入的Web浏览组件。这一技术主要适用于混合式移动开发,允许开发者在桌面应用中集成现代Web技术,提供更丰富的用户体验。 首先,我们要...

    opendds订阅发布c#封装1.0v

    《OpenDDS订阅发布C#封装详解》 OpenDDS(Open Data Distribution Service)是一个开源的分布式实时数据发布/订阅中间件,它提供了高效、可靠的数据通信服务。在C#环境中,为了方便开发者使用OpenDDS,通常会对其...

    C#封装C++DLL并调用

    C++ DLL提供了高效且低级别的功能,但它的API可能不直接适用于.NET环境,这就是C#封装C++ DLL的重要性。 首先,我们要理解C#和C++之间的差异。C#是基于.NET框架的高级编程语言,而C++则是一种更底层的语言,它可以...

    C#封装的谷歌内核浏览器

    我们可以理解"C#封装的谷歌内核浏览器"是一个利用C#和Chromium技术构建的自定义浏览器解决方案,它结合了C#的编程优势和Chromium的高性能渲染,为企业或个人开发者提供了定制化Web应用的可能性。在实际应用中,这样...

    C#封装C++实例

    综上所述,C#封装C++是一种常见的跨语言编程技术,它使得开发者可以充分利用C++的性能优势,同时享受C#的高级特性和开发便利性。在实践中,需要关注数据类型转换、异常处理、内存管理等多个方面,以确保程序的稳定性...

    C#封装的adb helper类库

    总的来说,这个C#封装的adb helper类库为Android开发者和自动化测试人员提供了一站式的解决方案,简化了adb操作,提升了工作效率,降低了出错的可能性。通过学习和使用此类库,开发者可以更加专注于应用程序的逻辑,...

    java调用C#封装的dll方法

    ### Java调用C#封装的DLL方法 #### 第一种方法:Java利用JNA进行调用 **背景介绍:** 为了实现Java与C#之间的交互,一种常用的方式是通过调用C#封装的DLL文件来完成特定功能。这种方法涉及到.NET Framework与Java...

    Halcon - demo_halcon用C#封装_迈德威视_halconc#_DEMO_halconCsharp_

    总结,Halcon的C#封装和迈德威视摄像头的集成是一项综合性的任务,涉及图像处理、硬件控制以及软件工程实践。通过封装,我们能更高效地利用Halcon的强大功能,同时简化了与特定硬件设备(如迈德威视的摄像头)的交互...

    C#封装的chorme内核浏览器_demo

    **C#封装Chrome内核浏览器** 是一个技术实践,它涉及到使用C#编程语言与Google Chrome的Chromium内核进行交互,以创建自定义的浏览器应用程序。这种技术通常用于开发桌面应用,提供与Web浏览器类似的功能,但可以...

    用C#封装的串口通讯类

    本篇将深入探讨如何使用C#封装串口通讯类,并理解其中涉及的关键知识点。 1. **C#基础与.NET框架** C#是一种面向对象的编程语言,由微软公司开发,主要用于构建Windows应用程序和服务。它支持.NET框架,这是一个...

    C#封装的三维向量

    C#封装的三维向量,代码封装性还是比较不错的

    OPC C#封装类

    在本项目中,"OPC C#封装类"是为了简化OPC接口的使用,通过C#编程语言进行了封装,以方便在Visual Studio(VS)环境中进行开发应用。 OPC C#封装库的主要功能是提供一个简洁、易于使用的API,开发者可以借助这个库...

    C#系统封装并调用_函数_系统封装_

    C#中,我们使用访问修饰符(如public、private、protected等)来控制成员的可见性,实现封装。例如,将私有变量(private)用于存储数据,而提供公共方法(public)进行数据的读取和修改,这就是一个基本的封装实践...

    C# NativeWifi 的封装

    总之,通过C#封装微软的NativeWifi库,开发者可以更高效、更安全地管理Windows系统的无线网络功能。`Interop.cs`和`WlanApi.cs`这两份文件是封装的关键,它们分别提供了与原生API的桥梁和面向对象的接口。理解并运用...

    C#封装详细解释

    ### C#封装详解 #### 封装的概念及意义 封装是面向对象编程(OOP)中的一个核心概念,它指的是将数据及其对数据的操作绑定在一起,同时隐藏这些数据和操作的内部实现细节。简而言之,封装是将软件的实现细节进行隔离...

    C#源码 ModBusTCP封装实现

    总的来说,C#中的ModBusTCP封装是一种实用的工程实践,它使得开发者可以快速地将ModBus通信功能整合到自己的项目中,提高了开发效率和代码的可维护性。在使用过程中,根据具体需求,可能还需要考虑多线程处理、重试...

    2022年C# 封装控件,包含画ROI,涂抹,查看灰度值,缩放,拖动等功能。

    本话题聚焦于2022年C#封装的控件,这些控件具有强大的图形处理能力,包括画区域兴趣(ROI)、涂抹、查看灰度值、缩放以及拖动等实用功能。这些功能在图像处理、医学成像、视频分析等领域有广泛应用。 首先,让我们...

    C# socket封装类和组件含例程全部开源

    本资源“C# socket封装类和组件含例程全部开源”提供了一套全面且强大的C# Socket封装,旨在简化开发过程,提高代码的可读性和可维护性。以下是对这个开源项目的详细解析: 首先,Socket是TCP/IP协议族的基本组成...

Global site tag (gtag.js) - Google Analytics