属性的访问器包含与获取或设置属性有关的可执行语句。访问器声明可以包含 get 访问器或 set 访问器,或者两者均包含。声明采用下列形式之一:
get {}
set {}

get 访问器
get 访问器体与方法体相似。它必须返回属性类型的值。执行 get 访问器相当于读取字段的值。以下是返回私有字段 name 的值的 get 访问器:

private string name;  // the name field
public string Name // the Name property
{
get
{
return name;
}
}

当引用属性时,除非该属性为赋值目标,否则将调用 get 访问器读取该属性的值。例如:

  Employee e1 = new Employee();
  ...
  Console.Write(e1.Name); // The get accessor is invoked here
get 访问器必须在 return 或 throw 语句中终止,并且控制不能超出访问器体。

set 访问器
set 访问器与返回 void 的方法类似。它使用称为 value 的隐式参数,此参数的类型是属性的类型。在下例中,set 访问器被添加到 Name 属性:

public string Name
{
get
{
return name;
}
set
{
name = value;
}
}

当对属性赋值时,该操作将调用 set 访问器。例如:

e1.Name = "Joe"; // The set accessor is invoked here
在 set 访问器中对局部变量声明使用隐式参数名 (value) 是错误的。

备注
属性按如下方式,根据所使用的访问器进行分类:
只带有 get 访问器的属性称为只读属性。无法对只读属性赋值。
只带有 set 访问器的属性称为只写属性。只写属性除作为赋值的目标外,无法对其进行引用。
同时带有 get 和 set 访问器的属性为读写属性。
在属性声明中,get 和 set 访问器都必须在属性体的内部声明。
使用 get 访问器更改对象的状态是一种错误的编程样式。

====

我们通过下面的例子来认识什么是访问器:

 using System;

 namespace AccessorEG
{
public class Student
{
// 私有字段 private field
private int _age; // 公开的属性 public property
public int Age
{
get { return _age; }
set { _age = value; }
}
} class Program
{
static void Main(string[] args)
{
Student stu = new Student();
stu.Age = ; // 使用了修改
Console.WriteLine(stu.Age.ToString()); // 使用了读取
Console.ReadKey();
// 输出 10
}
}
}

  很好理解,访问器就是指对象类型成员对外界的接口,就是使对象类型成员与外界进行信息交互的桥梁,有了访问器,外界就能对对象成员进行读、写的对应操作。

  那么,什么成员能够拥有访问器呢?非只读的字段和事件是可以声明访问器的。当然,只读域也能提供被外界获取的接口,即get,但是只能在声明或构造函数中初始化,而且它并不支持提供set方法。

 using System;

 namespace AccessorEG
{
public class Student
{
// 私有字段 private field
private readonly int _age = ; // 公开的属性 public property
public int Age
{
get { return _age; }
}
} class Program
{
static void Main(string[] args)
{
Student stu = new Student();
Console.WriteLine(stu.Age.ToString()); // 使用了读取
Console.ReadKey();
// 输出 10
}
}
}

  上述代码中只读域的值在声明时就已经赋了,而它对应公开属性的访问器中也不能提供set方法,不然会无法通过编译,但是它可以被外界取得。

  关于字段的访问器我们还要说一些,常见的有以下写法:

using System;

 namespace AccessorEG
{
public class Student
{
#region 全访问权限
// 私有字段
private int _age;
// 与_age对应的公开属性,包含了set和get方法
public int Age
{
get { return _age; }
set { _age = value; }
} // 如果您安装了.NET3.0,那么您可以使用自动属性,届时,上面的代码即可以下面的代替
     // 在VS.NET下输入 prop 连击两下Tab键,编译器会自动帮您生成自动属性
     // public int Age { get; set; }
#endregion // 全访问权限 #region 只读属性
private string _name; public string Name
{
get { return _name; }
} // 等同于
     // public string Name { private set; get; }
#endregion #region 只写属性
private bool _sex; public bool Sex
{
set { _sex = value; }
}
// 等同于
     // public bool Sex { set; private get; }
#endregion } class Program
{
static void Main(string[] args)
{
Student stu = new Student();
stu.Age = ;
// stu.Name = "Johness"; 异常,编译错误,因为该属性只读
       // Console.WriteLine(stu.Sex.ToString()); 异常,编译错误,因为该属性只写
Console.WriteLine(stu.Age.ToString()); // 使用了读取
Console.ReadKey();
// 输出 18
}
}
}

  以上示例中的只读、只写仅对外界有效,如果您显示得制定了该访问器的所有者,即类的私有字段。那么在类的内部,您仍可以方便的使用您定义的私有字段进行读写操作,因此,我建议朋友们定义字段及其访问器使用.NET2.0的语法而不用3.0的新语法(自动属性)。当然,利用访问器也能更好地对数据有效性进行验证:

 using System;

 namespace AccessorEG
{
public class Student
{
// 私有字段
private int _age;
// 与_age对应的公开属性,包含了set和get方法
public int Age
{
get { return _age; }
// 利用访问器对输入的年龄进行验证
       // 如果输入值小于0或者大于100
       // 可以赋为默认值18或者不进行操作
set
{
if (value >= && value <= )
_age = value;
// 如果数据无效不进行操作可以注释以下内容
else
_age = ;
}
} } class Program
{
static void Main(string[] args)
{
Student stu = new Student();
stu.Age = -; // 赋无效值
Console.WriteLine(stu.Age.ToString());
Console.ReadKey();
// 输出 18
}
}
}

C#属性访问器的更多相关文章

  1. 14.C#属性访问器、命名空间、pragma指令(七章7.3-7.5)

    看到一些零星的知识片,今天就用自己的理解说明下,也是因为太简单了,一下就过的,也是我们日常开发中常用.留下一个脚印,当书不在手上的,也能翻出来看看.说下属性访问器.命名空间和pragma指令. 属性访 ...

  2. c#接口和new关键字和属性访问器基础收获

    1.interface 对于接口,一把我在项目中会这样使用: interface IStudent { string Name(); string GoSchool(); } 但是呢,这样有个不好的地 ...

  3. C# set get 函数 属性访问器

    属性访问器  拿东西就是Get,放东西就是Setprivate string namepublic String Name{set{name = value;}get{return name;}}ge ...

  4. 小鱼提问2 属性访问器中get,set再用public修饰行吗,private呢?

    /// <summary> /// 是否有一个用户正在连接服务器中 /// </summary> public bool IsConnectting { get { retur ...

  5. ruby里面的属性访问器

    和ios的@property一样 attr_accessor 表明是示例的getter和setter 下面的是rails的扩展,裸体class里面用,貌似会报错 cattr_accessor 表明是类 ...

  6. JavaScript 属性类型(数据属性和访问器属性)

    数据属性 数据属性包含一个数据值的位置.在这个位置可以读取和写入值.数据属性有 4 个描述其行为的特性. [[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性,能否修 ...

  7. javascript对象属性——数据属性和访问器属性

    ECMA-262第五版在定义时,描述了属性property的各种特征,定义这些特性是为了实现javascript引擎用的,为了表示该特性是内部值,规范把它们放在了两对儿方括号中,例如[[Enumera ...

  8. JavaScript 属性类型(数据属性 访问器属性)

    ECMA-2把对象定义为:“无序属性的集合,其属性可以包含基本值.对象或者函数.” 严格来说,这就相当于说对象是一组没有特定顺序的值.对象的属性或方法都有一个名字,而每个名字映射到一个值.我们可以把E ...

  9. js对象的属性:数据(data)属性和访问器(accessor)属性

    此文为转载,原文: 深入理解对象的数据属性与访问器属性 创建对象的方式有两种:第一种,通过new操作符后面跟Object构造函数,第二种,对象字面量方式.如下 var person = new Obj ...

随机推荐

  1. ArrayList笔记

    elementData是一个缓存数组,它通常会预留一些容量,等容量不足时再扩充容量,这个楼主一定是明白的,不用多解释.假如现在实际有了5个元素,而elementData的大小可能是10,那么在序列化时 ...

  2. ubuntu12.04 修复Grub2

    电脑双系统,但是把win7重装了之后,会发现grub坏了,只能进入win7. 遇到过好几次,虽然每次都成功解决问题了,但是都花费了不少时间. 所以,总结一下,基本是从网上找到的方法,有的行不通,有的可 ...

  3. 第n小的质数

    总时间限制:  1000ms 内存限制:  65536kB 描述 输入一个正整数n,求第n小的质数. 输入 一个不超过10000的正整数n. 输出 第n小的质数. 样例输入 10 样例输出 29 代碼 ...

  4. sql中的字符串匹配、函数大全

    假设你想建立一个与Yahoo功能相似的Internet目录.你可以建立一个表用来保存一系列的站点名称,统一资源定位器(URL),描述,和类别,并答应访问者通过在HTML form中输入要害字来检索这些 ...

  5. font-size单位换算

    Points Pixels Ems Percent 6pt 8px 0.5em 50% 7pt 9px 0.55em 55% 7.5pt 10px 0.625em 62.5% 8pt 11px 0.7 ...

  6. COM ,Threading Models,apartments,RPC

    Component Object Model (COM) https://msdn.microsoft.com/en-us/library/windows/desktop/ms680573%28v=v ...

  7. Web前端开发笔试&面试_03

    WL: 1.如何显示.隐藏一个dom对象? 2.如何将一个网页中的内容水平置中?写出重要的html标签和css. (css:#content{align:center;float:left;}html ...

  8. 【转】HTML - embed 与 object 之争

    在 HTML 里嵌入文本和图片之外的事物,就会用到嵌入标签,而嵌入标签在各浏览器之间的不统一,一直是让开发人员很头痛的问题.一切都要从嵌入 SUN 公司的 Applet Java 小程序开始. 当时, ...

  9. WebLogic11g-半小时让你的domain集群化

    WebLogic11g-半小时让你的domain集群化 WebLogic11g-负载分发 weblogic proxy.war配置 web.xml <!DOCTYPE web-app PUBLI ...

  10. Mysql 排序优化与索引使用(转)

    为了优化SQL语句的排序性能,最好的情况是避免排序,合理利用索引是一个不错的方法.因为索引本身也是有序的,如果在需要排序的字段上面建立了合适的索引,那么就可以跳过排序的过程,提高SQL的查询速度.下面 ...