在早期学习c#的过程中,经常遇到这样的语句:

public string StudentName
{
           get{return stuName;}
           set{stuName=value;}
}

当时也不是很明白为什么要这样?学深了c#后,又没法对其做一个总结。今天看了《Visual c#.net程序设计教程》这本书,总结得不错,做下笔记:

在许多面向对象程序设计语言中,属性(property)是指对象的特征和状态,具体地说就是指对象的数据成员。程序员可以指定数据成员能否被外界直接访问,如果数据成员被指定为public的,外界就可以用“对象名.公有数据成员名”访问该成员。c#是完全面向对象的语言,c#倡导一种新途径,对数据成员能够更好地封装和保护,同时又向外界提供更有效的访问形式。c#中用来达到这个目标的就是“属性”,而那些数据成员,在c#中称为“字段”或“域”。

属性的定义和使用
属性由两个部分组成:属性头和存储器。存储器分为get访问器和set访问器。声明属性的一般形式为:

修饰符  类型  属性名
{
get //get存取程序
{...}
set //set存取程序
{...}
}
简写:修饰符+类型+属性名{get;set;}

属性的修饰符可以是任何访问控制符,还可以被定义为静态。get和set是一种特定的方法,get用来从对象中读取数据,而set用来向字段写入数据,将外界的数据写入字段时,c#使用value表示输入的数据,value可以说是一个准关键字,例如:

set{aField=value;}

以下是一个简单的例子,演示了属性的基本形式和用法:
using System;
using System.Collections.Generic;
using System.Text;
namespace 属性的用法
{
public class Student
{
private string stuName = "阿会楠";
public string studentName
{
get { return stuName; }
set { stuName = value; }
}
}
class Program
{
static void Main(string[] args)
{
Student stu = new Student();
Console.Write(stu.studentName);
Console.ReadKey();
}
}
}

上面代码中定义了一个属性studentName,它包含get访问器和set访问器。属性studentName封装了类Student中的字段stuName,字段如果没有加访问控制符,被默认为private,外界不能直接访问它,现在外界可以通过studentName属性自由地存取stuName字段了。

属性的get和set都是可执行的程序语句组合,具有行为的特点;而使用具有get访问器和set访问器的属性时候就像使用字段一样,即可以作为左值接受数据,又可以作为右值输出数据,系统正是按照属性出现在语句中的位置,自动地选择是调用get还是调用set。

属性的读写控制
       属性中的get和set可以只用一个,如果只有get而没有set,那么这个属性只可读出,不可写入;如果只有set而没有get,那么这个属性是只写入,不可读出。

在属性中完成更多功能
       既然get和set是程序,那当然可以做更多的事情。一个合理的分工是:设计字段是为了便于内部方法使用,而尽量与外界隔绝;设计属性考虑的是方便外界的使用,但是不让外界知道的数据一律不给。

最后给一个例子:

using System;
using System.Collections.Generic;
using System.Text; namespace 属性的用法
{
public class Student
{
private string stuCollege = "jyu";//学校名称不可修改
private string stuName = "阿会楠";
private int stuAge = ;
public string studentName
{
get { return stuName; }
set { stuName = value; }
}
public int studentAge
{
get { return stuAge; }
set { stuAge = value; }
}
public string studentCollege
{
get { return stuCollege; }
}
public string studentInfo
{
get { return "学校:" + stuCollege + "名字:" + stuName + "岁数:" + stuAge;}
}
}
class Program
{
static void Main(string[] args)
{
Student stu = new Student();
Console.Write(stu.studentCollege + "/n");
stu.studentAge = ;
Console.Write(stu.studentInfo);
Console.ReadKey();
}
}
}
public string Name;//一般属性,可写、可读

Public string Email{get;set;}//可写、可读

Public string Age{get;}//只读

public string Height{set;}//只写

首先,这是一堆属性,Name属性在C#里面可以称之为字段,只要在同一个命名空间下面就可以可读可写。

如Email属性是也可度可写的,那么这两个区别在哪呢,当然在你的业务逻辑上,如果我想对Email的格式做出校验(当你设置邮箱格式的时候就可以校验),那么Email就可以,Name属性这种写法就不能加入逻辑代码。而且,Name属性编译之后,就是一个字段Name,但是Emai{get;set;}属性编译之后就是两个函数:

//字段
private string email;
//读取邮箱
public string GetEmail(){
return this.email;
}
//设置邮箱
public void SetEmail(string value){
this.email=value;
}

那么Age{get;}这个属性是只读的,那么在编译之后会变成一个函数:

private string age;
public string GetAge(){
return this.age;
}

同样的,可以得出 Height{set;}会编译成一个函数:

private string height;
public string SetHeight(string value){
this.height=value;
}

最新文章

  1. Lesson 22 A glass envolops
  2. MIT 6.828 JOS学习笔记18. Lab 3.2 Part B: Page Faults, Breakpoints Exceptions, and System Calls
  3. SQL Server 2008 R2——CROSS APPLY 根据数据出现的次数和时间来给新字段赋值
  4. C#中的继承
  5. CSRF攻击原理以及防御
  6. 火狐 about:config
  7. JSP常见指令
  8. 【原创】关于hashcode和equals的不同实现对HashMap和HashSet集合类的影响的探究
  9. 模版引擎(NVelocity)开发
  10. ASP.NET MVC5 生成验证码
  11. 1.3. chromium源代码分析 - chromiumframe - 窗口系列
  12. openwrt 添加 应用(luci-application)
  13. islider结合react的简单实用
  14. 利用并查集+贪心解决 Hdu1232
  15. CML\LVDS
  16. 解决svn检出后不显示图标的问题
  17. 搭建ubuntu14.04服务器必备环境
  18. C语言实例:数组与字符串
  19. 2--linux命令--查看磁盘空间
  20. 為你的文件夾添加“使用CMD命令打開”菜單

热门文章

  1. useMemo、useCallback简单理解
  2. PHP-生产随机验证码图片
  3. redis2. sds 字符串(SimpleDynamicString)
  4. vsCoad设置代码自动换行
  5. UML 2.5版本与UML分类概述
  6. [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(一) (转)
  7. SpringBoot之解决一对一、多对一、多对多等关联实体在JSON序列化/输出时产生的无限递归死循环问题(infinite recursion)
  8. HTML之表单类控件、图像类元素的CSS特别样式汇总
  9. Java内部类(3):局部内部类
  10. 静态web页面与动态web页面的区别