封装概念
  C#是面向对象的一门语言,面向对象的语言有三大特性:封装、继承、多态。而封装可以实现一个自定义的类,从而定义新的对象
  封装是将一个或多个项目集合在一个单元中,这个单元称之为类。这样可以防止对实现细节的访问
  C#封装可以根据需要通过修饰符实现类成员的范围和可见性。访问修饰符有:
    public:公共的,任何地方都可以访问,但是需要引用命名空间
    private:私有的,类的内部才可以访问
    internal:内部的,默认的,程序集中可以访问,程序集就是命名空间
    protected:被保护的,类的内部和类的父类和子类中可以访问
    Protected internal :protected和internal的并集,符合任意一条都可以访问

示例

观察如下代码

 namespace Student
{
class Student
{
public string _code;
public string _sex;
public int _age;
} class StudentAction
{
static void Main(string[] args) {
Student XiaoMing = new Student();
XiaoMing._code = "";
XiaoMing._sex = "男";
XiaoMing._age = ;
}
}
}

用public修饰的属性,不够安全,成员函数可以直接访问这些变量

用Private 修饰符则允许一个类将其成员变量和成员函数对其他的函数和对象进行隐藏。只有同一个类中的函数可以访问它的私有成员。

在VS中快速封装的快捷键为:Ctrl+R+E,如下图:

使用prvite后,则函数将不能再对其成员变量访问,如下图:

  

需要对外提供一个接口,代码如下:

 namespace StudentSpace
{
class Student
{
private string _code; //成员变量
private string _sex;
private int _age; public string Code //进行封装的时候要用public,保证类外可以使用
{
get
{
return _code; //成员属性
} //属性一般用小写字母表示,但是封装的时候首字符要大写 set
{
_code = value;
}
} public string Sex
{
get
{
return _sex; //成员属性
}
set
{
_sex = value;
}
} public int Age
{
get
{
return _age; //成员属性
} set
{
_age = value;
}
}
}
}

主函数调用:

 //主函数中调用
class StudentAction
{
static void Main(string[] args)
{
Student XiaoMing = new Student();
XiaoMing.Code = "";
XiaoMing.Sex = "男";
XiaoMing.Age = ; Console.WriteLine(XiaoMing.Code);
Console.WriteLine(XiaoMing.Sex);
Console.WriteLine(XiaoMing.Age);
}
}

主函数执行结果如下:

遇到的问题

  在此期间,笔者将namespace与class的名称都写成了Student,导致在主函数中调用时直接写Student报错误

  如果是在同一个namespace封装函数并且调用函数没有问题

  不在同一个namespace程序就会认为调用的是namespace而不是class,所以报错,修改方法有两种:

    1、修改下namespace使两者的命名不一致;

    2、使用namespace.class调用,将class名称跟在namespace名称后面

封装中的set

  在封装中get 是读取即属性取值,set 是赋值即属性赋值,也就是主函数不能调用_code,而能调用的是Code,但赋值的却是_code

  在封装过程中对于学生的性别要有特殊处理,学生的性别要么是男要么是女,其他值为非法值,不能允许非法值输入

  代码如下: 

 public string Sex
{
get
{
return _sex; //成员属性
}
set
{
if (value == "男" || value == "女")
_sex = value;
else
_sex = "性别只能是男或女";
}
}

  执行主函数:

  

C#-封装(七)的更多相关文章

  1. angular封装七牛云图片上传,解决同一页面多个上传按钮分别上传

    step1:引入文件 引入Plupload *该SDK上传功能集于Plupload插件封装,所以需要下载Plupload; plupload.dev.js 引入qiniu.js为了简便,当时直接从官网 ...

  2. StackExchange.Redis帮助类解决方案RedisRepository封装(基础配置)

    本文版权归博客园和作者吴双本人共同所有,转载和爬虫,请注明原文地址.http://www.cnblogs.com/tdws/p/5815735.html 写在前面 这不是教程,分享而已,也欢迎园友们多 ...

  3. StackExchange.Redis帮助类解决方案RedisRepository封装(字符串类型数据操作)

    本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/tag/NoSql/ 目录 一.基础配置封装 二.String字符串类型数据操作封 ...

  4. 孟老板 BaseAdapter封装(五) ListAdapter

    BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...

  5. 孟老板 BaseAdapter封装 (一) 简单封装

    BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...

  6. 孟老板 BaseAdapter封装 (二) Healer,footer

    BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...

  7. 孟老板 BaseAdapter封装 (三) 空数据占位图

    BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...

  8. 孟老板 BaseAdapter封装(四) PageHelper

    BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...

  9. 无需写try/catch,也能正常处理异常 (转)

    原文地址: http://www.cnblogs.com/artech/archive/2012/10/28/automatic-exception-handling-aspnet.html 对于企业 ...

  10. 继承(JAVA)

    继承是面向对象最显著的一个特性.继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力. 一.继承的基本语法: 在Java语言中,用extends关键字表示一个类继承了另 ...

随机推荐

  1. ④品茶看<Servlet&JSP>-EL表达式

    前言 今早,概率课偷了下小懒写的: 泡一杯红茶,ACM集训前,写篇博客记录记录EL表达式. #EL介绍 ①EL 语法 ②访问JavaBean等 ③EL隐式对象 ④EL运算符 EL介绍 EL 全名为Ex ...

  2. Java 容器源码分析之 LinkedList

    概览 同 ArrayList 一样,LinkedList 也是对 List 接口的一种具体实现.不同的是,ArrayList 是基于数组来实现的,而 LinkedList 是基于双向链表实现的.Lin ...

  3. Angular2入门:TypeScript的类 - 参数属性:定义和初始化类成员

  4. JVM中对象的回收过程

      当我们的程序开启运行之后就,就会在我们的java堆中不断的产生新的对象,而这是需要占用我们的存储空间的,因为创建一个新的对象需要分配对应的内存空间,显然我的内存空间是固定有限的,所以我们需要对没有 ...

  5. 手动生成/etc/shadow文件中的密码

    shadow文件的格式就不说了.就说说它的第二列——密码列. 通常,passwd直接为用户指定密码就ok了.但在某些情况下,要为待创建的用户事先指定密码,还要求是加密后的密码,例如kickstart文 ...

  6. Perl的特殊代码块:BEGIN、CHECK、INIT、END和UNITCHECK

    这是5个特殊的代码块.要理解这几个块,关键在于几个时间点: (1).程序编译期间 (2).程序执行期间 (3).程序执行结束但还未退出期间 BEGIN块 BEGIN块是在程序编译期间执行的,也就是上面 ...

  7. 建立多页面vue.js项目

    介绍 根据需求,我们希望建立一个多页面的vue.js项目,如何改造单页面vue.js项目为多页面项目?跟着我的步伐看下去吧. 1.创建单页面vue.js项目 简单的记录一下创建步骤: --安装cnpm ...

  8. 建立uboot,内核的SI工程(1)

    1. 建立Uboot的SI工程1.1首先给uboot打上补丁,然后来生成压缩文件 tar cjf u-boot- 1.2 编译uboot make 100ask24x0_config //使用打好补丁 ...

  9. P、NP、NPC、NP-Hard问题到底是何方神圣?

    最近在做一个求解有向图中回路的问题,老师说求解图中全部回路是一个NP难问题.突然想到P.NP.NPC.NP-hard的描述一致不是很清楚,所以又学习了一下. 在解释这四个概念之前,我们需要先知道两个问 ...

  10. SaaS技术栈的走势

    本地部署时代 在软件还是“本地部署(on-premise)”的时候,SaaS的版图被大型玩家把持着,几乎所有的垂直领域(营销.支持.销售.人力)都被微软.SAP等大公司的解决方案占据.那时候的用户并没 ...