OOP面向对象的三大特点:封装(encapsulation),继承(inheritance),多态(encapsulation)

和JAVA与C++一样,C#也是OOP语言。并且,C#对数据的封装要比C++更好。另外,在C++里面可能习惯从main函数开始程序,类是作为主函数的一部分而存在的。而C#里面,所有的所有都是在某个类中进行。

这里还是说C#较其他语言不一样的地方。

有关类Class

1.方法参数Arguments和传递参数Parameters

首先说一下这两个词的区别。其实都是指参数,大多时候也都是互相通用。具体的,parameters指在声明方法的时候中的参数,而arguments指调用方法时传到方法中的参数。

第一,关于可选(默认)变量:

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Program obj = new Program();
 6             int num1 = 100, num2 = 200, num3 = 300;
 7             obj.PrintMethod(num1, num2, num3);
 8             obj.PrintMethod(num1);
 9             obj.PrintMethod(num1, arg3: num3);
10             Console.ReadKey();
11         }
12         void PrintMethod(int arg1, int arg2=20, int arg3=30)
13         {
14             Console.WriteLine(arg1 + " " + arg2 + " " + arg3);
15         }
16     }

PrintMethod方法参数列表里面有三个参数,后两个成为可选变量。也就是说,他们在方法被调用时可以填写也可不填。不填写则使用默认的值。

可选变量在C#3.0里是不允许的,而到了4.0就可以使用了。注意,如果想要在调用的时候跳过某一个可选变量对后面的进行赋值,需要向上面第9行一样,用参数名:具体值得形式赋值。

上面的运行结果

第二,Passing by reference or by value

相信这两个已经烂熟于心了吧。不多解释。C#一样是不加说明则按值,通过在parameter列表里加ref说明是按引用。

除这两个之外,C#多了一种out参数。由于C#需要明确赋值,即变量须在使用之前进行赋值。所以如果将只声明而未赋值的变量按引用ref传到方法中,就会出现错误。这个out就是在这儿使用的,可以将未赋值的变量传入方法。

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Program obj = new Program();
 6             int num1 = 100, num2;
 7             obj.ValueMethod(num1);
 8             Console.WriteLine("After By Value: " + num1);
 9             num1 = 100;
10             obj.ReferenceMethod( ref num1);
11             Console.WriteLine("After By Reference: " + num1);
12             obj.OutMethod(out num2);
13             Console.WriteLine("After By Out: " + num2);
14             Console.ReadKey();
15         }
16         void ValueMethod(int arg1)
17         {
18             arg1 = 50;
19         }
20         void ReferenceMethod(ref int arg1)
21         {
22             arg1 = 50;
23         }
24         void OutMethod(out int arg1)
25         {
26             arg1 = 25;
27         }
28     }

上面说的这些适用于除了引用类型的数据类型。引用类型有五种:class、interface、delegate、object、string

并不是说引用类型就都是按照引用方式传递了,具体的当引用类型作为参数时:
1、在修改变量本身时,结果类似于值传递,即不会改变传递前的变量的值
2、在修改变量的属性或字段时,才是引用传递,会影响到传递前的变量的值
3、参数使用了ref后,才是真正的引用传递,不管修改变量本身还是修改变量的属性或字段,都会影响到传递前的变量的值

2.this指针

为了明确一些名字的混淆问题,我们经常在类里面使用this指针,它指向当前对象(object)。不同的是C++里面this指针后要通过->来获得object里面的内容,而C#内可以直接通过.(dot)使用。(不刻意的区分指针和具体对象了)

3.static

静态的方法或成员变量在C#中必须只能直接通过类来访问,不允许通过具体该类的实例对象来访问。这一点要注意

另外static方法中不可使用this,而静态方法只能访问静态成员变量。

4.销毁对象

C#想JAVA一样是隐式的进行垃圾回收。如果需要显示的释放空间,通过析构方法来进行。

不过C#显示调用析构方法是不合法的。需要通过实现IDisposable接口,具体的添加Dispose方法。

这里可以使用代码

 1 class SomeClass : IDisposable
 2 {
 3     bool is_disposed = false;
 4     protected virtual void Dispose(bool disposing)
 5     {
 6         if(!is_disposed)
 7         {
 8             if (disposing)
 9             {
10                 Console.WriteLine("Not in destructor");
11             }
12             Console.WriteLine("Disposing...");
13         }
14         this.is_disposed = true;
15     }
16     public void Dispose()
17     {
18         Dispose(true);
19         GC.SuppressFinalize(this);
20     }
21     ~SomeClass()
22     {
23         Dispose(false);
24         Console.WriteLine("In destructor");
25     }
26 }

5.通过属性进行数据封装

在设计类的时候,我们总是希望将类的内部状态隐藏在类成员之间,通过方法来间接地访问。当是客户却总是希望直接访问这些属性。解决这个冲突的方法就是通过属性实现。

 1 public int Salary
 2 {
 3     get
 4     {
 5         return salary;
 6     }
 7     set
 8     {
 9         this.salary = value;
10     }
11 }

通过get和set可以通过类似属性的方式来设置或访问具体内容

6.readonly字段

也就是constant

被声明为readonly的值只能在声明时被赋值。如果是静态readonly值则还可以在static从constructor里赋值

转载于:https://www.cnblogs.com/sywang/p/4378867.html

C#学习记录3上——类的封装,继承,多态相关推荐

  1. python--编写程序:实现乐手弹奏乐器,乐手可以弹奏不同的乐器而发出不同的声音------使用类的封装继承多态的问题/使用面向对象的思想,设计自定义类,描述出租车和家用轿车的信息

    编写程序:实现乐手弹奏乐器,乐手可以弹奏不同的乐器而发出不同的声音 ------使用类的封装继承多态的问题 class Instrumnet():#乐器类def make_sound(self):pa ...

  2. 类的封装继承多态以及virtual interface-SV

    文章目录 一.面向对象 1.1术语 1.2 三大特性和五大原则 1.3 验证为什么需要OOP 二.类和对象 2.1浅复制shallow copy 2.2 深复制(deep copy) 三.类的封装和继 ...

  3. c语言编程 菲薄拉,C语言设计模式-封装-继承-多态

    快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在CSDN一博客看到有大牛在讨论C的设计模式,正好看到了,我也有兴趣转发,修改,研究一下. 记得读大学的时候,老师就告诉我们 ...

  4. 小白理解——封装继承多态

                                      一.封装 是什么:首先是抽象,把事物抽象成一个类,其次才是封装.对外表示为一个对象,隐藏对象的属性和动作实现的细节,仅对外公开接口. ...

  5. python 参数类型的多态_【Python】面向对象:类与对象\封装\继承\多态

    六.Python面向对象--类与对象\封装\继承\多态 1.什么是面向对象编程 1.1 程序设计的范式:程序可控,易于理解 1.2 抽象并建立对象模型 1.3 程序是不同对象相互调用的逻辑.每个对象在 ...

  6. 大数据笔记8—java基础篇4(面向对象-封装-继承-多态)

    面向对象 一.面向对象 1.面向过程 1.2.举例 1.3.总结 二.面向对象 1.简述 2.举例 3.思想特点 2.1.类的定义格式 2.1.1.简述 2.2.2.格式 2.3.3.示例 三.类的使 ...

  7. Java继承_Hachi君浅聊Java三大特性之 封装 继承 多态

    Hello,大家好~我是你们的Hachi君,一个来自某学院的资深java小白.最近利用暑假的时间,修得满腔java语言学习心得.今天小宇宙终于要爆发了,决定在知乎上来一场根本停不下来的Hachi君个人 ...

  8. 白话文带你了解 封装 继承 多态

    这里讲的仅仅是带你理解 封装 继承 多态 染好您可以移步去别的文章学习具体的实现 (只是个人理解 您可以不爱,请别伤害哦!) 首先你要知道 java是面向对象的,说白了就是我拿你当个人,请认清你的地位 ...

  9. 面向对象 编程及面向对象三大属性:封装 继承 多态

    面向对象 面向对象(Object Oriented,OO)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结构.应用平台.分布式系统.网络管理结构. ...

最新文章

  1. centos7 安装 python3
  2. IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boo
  3. vector模板,初学者必读
  4. android 随手记代码,用ExpandableListView写的随手记实例
  5. Elasticsearch-集群原理
  6. [分享] Flask 网络开发经典书籍: Flask Web Development
  7. 3.4.1 - Numeric Types
  8. linux系统怎么刷新,Fedora Linux如何更新系统
  9. (转载)mysql查询今天、昨天、7天、近30天、本月、上一月数据
  10. 电脑硬盘分区合并_简单扩容电脑C盘,无需U盘重装系统
  11. 阿里首席架构师分享的Java工程师职业规划
  12. java怎么实现垂直导航栏_jquery实现垂直和水平菜单导航栏
  13. MySQL Workbench 如何连接 Amazon EC2 上的MySQL服务器?
  14. 前端数据可视化echarts.js使用指南
  15. 5步绘制软件开发流程图
  16. 微信小程序开发之路④
  17. 人工智能全球 2000 位最具影响力学者榜单
  18. IDEA使用搜狗输入法变为繁体如何办???
  19. Ubuntu12.04 Thinkpad T410i 安装记录 持续更新...
  20. 春林文件批量改名系统

热门文章

  1. LAMP 系统性能调优,第 3 部分: MySQL 服务器调优(转)
  2. 面试官问我:平常如何对你的 Java 程序进行调优?
  3. 视差滚动(Parallax Scrolling)插件补充
  4. 从Java到Go面向对象--继承思想.md
  5. Vue.directive自定义指令
  6. Windows Mobile开发资源相关下载收录
  7. 清华大学《操作系统》(二十):死锁和进程通信
  8. excel合并两列内容_还在为合并WPS表格(Excel)中两列内容而犯愁?此方法简单高效...
  9. Colemak布局的实现 Window+Linux+Android
  10. Python实现GitBook工具