属性和字段不同,属性是一个函数成员:它提供灵活的机制来读取、编写或计算某个私有字段的值。 可以像使用公共数据成员一样使用属性,但实际上它们是称作“访问器”的特殊方法。 这使得可以轻松访问数据,此外还有助于提高方法的安全性和灵活性。

属性不为数据存储分配内存空间,它是执行代码。

意思是如果我们想封装类的成员变量,但是我们总不能把所有的变量都封装的死死的,不允许外面的任何人看到,这是不合理的。

例如有一个person类,它的属性有姓名、性别、年龄等。我要访问某个对象的性别,或者设置某个对象的性别。

外部的对象要实现,对它的访问,有三种方法:

1.把属性改正public的权限,这样任何人都能看到或者修改这个属性,这样很简洁,但是出现的问题是安全性降低,比如我对这个字段赋值“牛”,那么这个对象的的性别字段就是“牛”了,显然不合理。

2.仍然保持字段的private私有属性,编写一个方法实现字段的修改,但是这样以来,外部对象访问内部私有对象的时候,很麻烦,必须调用set()或者get()方法。那么就寻求一种方法,能不公开私有字段,同时又能很简洁的调用,就好像是在直接访问成员字段一样,所以就引入了第三种方法:属性。

3.属性封装字段数据,对象的字段保持其private的访问权限,利用属性实现封装,好像直接访问成员字段一样供外部对象使用。但是本质上仍然是通过类的成员方法访问才实现的。属性也是类的成员,但是它是私有地段的封装,只是私有字段的一个对外的接口,它能通过一些逻辑保证私有字段访问的安全机制,同时又不会像第2种方法那样使用用户不友好的接口。能像直接访问私有字段一样访问。

在本示例中,TimePeriod 类存储一个时间段。 在内部,类以秒为单位存储时间,但客户端使用名为 Hours 的属性能够以小时为单位指定时间。 Hours 属性的访问器执行小时和秒之间的转换。

 class TimePeriod
{
private double seconds; public double Hours
{
get { return seconds / ; }
set { seconds = value * ; }
}
} class Program
{
static void Main()
{
TimePeriod t = new TimePeriod(); // Assigning the Hours property causes the 'set' accessor to be called.
t.Hours = ; // Evaluating the Hours property causes the 'get' accessor to be called.
System.Console.WriteLine("Time in hours: " + t.Hours);
}
}
// Output: Time in hours: 24

value 关键字用于定义由 set 取值函数分配的值。

我们可以设置访问修饰符限制get和set方法的访问权限,为此,属性必须既有set又有get访问方法,而且只能限制其中之一,修饰符必须必属性本身已有的访问权限要严格。

此示例演示如何创建一个不可变轻量类,用于仅封装一组自动实现的属性。 当您必须使用引用类型语义时,请使用此种构造而不是结构。

请注意:对于自动实现的属性,需要 get 和 set 访问器。 要使该类不可变,请将 set 访问器声明为 private。 但是,声明私有 set 访问器时,不能使用对象初始值来初始化属性。 必须使用构造函数或工厂方法。

  // This class is immutable. After an object is created,
// it cannot be modified from outside the class. It uses a
// constructor to initialize its properties.
class Contact
{
// Read-only properties.
public string Name { get; private set; }
public string Address { get; private set; } // Public constructor.
public Contact(string contactName, string contactAddress)
{
Name = contactName;
Address = contactAddress;
}
} // This class is immutable. After an object is created,
// it cannot be modified from outside the class. It uses a
// static method and private constructor to initialize its properties.
public class Contact2
{
// Read-only properties.
public string Name { get; private set; }
public string Address { get; private set; } // Private constructor.
private Contact2(string contactName, string contactAddress)
{
Name = contactName;
Address = contactAddress;
} // Public factory method.
public static Contact2 CreateContact(string name, string address)
{
return new Contact2(name, address);
}
}

前面说了,属性只是封装数据字段,编译器为每个自动实现的属性创建了后备字段 这些字段无法直接从源代码进行访问。

最新文章

  1. 【思路】-jscode
  2. Android--全局获取Context
  3. Java数据结构——二叉树
  4. jquery验证手机号码和固定电话号码
  5. GitLab安装手记
  6. Matlab的曲线拟合工具箱CFtool使用简介
  7. C# Socket 入门2(转)
  8. C# 分布式缓存服务器方案
  9. akka 文章 博客
  10. Ubuntu下安装PDF 文档阅读器Adobe Reader 9.5.5
  11. C#特性:从自定义一个特性开始,谈谈什么是特性
  12. 使用SQL语句时应该注意的一些问题
  13. Java RESTful 框架的性能比较
  14. Heap Sort - recursion
  15. 【转】shell编程下 特殊变量、test / [ ]判断、循环、脚本排错
  16. redgate的mysql架构比较和数据比较工具
  17. JXOI2018守卫 区间DP
  18. Python Basics
  19. SQL Server基础知识三十三问 (1-7)
  20. linux Nginx 日志脚本

热门文章

  1. 乐酷工作室孙志伟:Testin云測试有广度有深度 省钱省力值得信赖
  2. RMAN备份之丢失数据文件及控制文件的恢复
  3. 使用fat jar和exe4j把java程序打包成exe执行文件---转载的
  4. 第001篇——C#学习计划开启
  5. 常用的CSS清除浮动的方法优缺点分析(个人学习笔记)
  6. Nodejs随笔(三):全局对象之process
  7. codevs1127
  8. <转>泛型的内部原理:类型擦除以及类型擦除带来的问题
  9. jQuery的extend详解
  10. [jQuery] jQuery如何获取同一个类标签的所有的值