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

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

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

例如有一个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);
}
}

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

[C#参考]属性的更多相关文章

  1. css 参考属性大全

    动画属性 属性 描述 CSS @keyframes 定义一个动画,@keyframes定义的动画名称用来被animation-name所使用. 3 animation 复合属性.检索或设置对象所应用的 ...

  2. JavaScript 访问对象属性和方法及区别

    这篇文章主要介绍了浅析JavaScript访问对象属性和方法及区别的相关资料,仅供参考 属性是一个变量,用来表示一个对象的特征,如颜色.大小.重量等:方法是一个函数,用来表示对象的操作,如奔跑.呼吸. ...

  3. Qt之QSS(Q_PROPERTY-原始属性)

    http://blog.csdn.net/liang19890820/article/details/51698536 版权声明:进步始于交流,收获源于分享!纯正开源之美,有趣.好玩.靠谱...作者: ...

  4. Implement Property Value Validation in Code 在代码中实现属性值验证(XPO)

    This lesson explains how to set rules for business classes and their properties. These rules are val ...

  5. Implement Dependent Reference Properties 实现从属引用属性 (XPO)

    In this lesson, you will learn how to implement properties whose values can depend on other properti ...

  6. Implement Dependent Reference Properties实现依赖引用属性 (EF)

    In this lesson, you will learn how to implement properties whose values can depend on other properti ...

  7. XAF-在代码中实现属性值验证(EF)

    This lesson explains how to set rules for business classes and their properties. These rules are val ...

  8. 帆布指纹识别(canvas fingerprinting)

    广告联盟或许网站运营者都希望能够精准定位并标识每一个个体,通过对用户行为的分析(浏览了哪些页面?搜索了哪些关键字?对什么感兴趣?点了哪些按钮?用了哪些功能?看了哪些商品?把哪些放入了购物车等等),为用 ...

  9. 介绍Oedis - Redis OH/RM

    作死造轮子 Oedis是近段时间为了解决日志型数据如何与Entity Framework的查询整合的问题写的一个Redis的OH /RM.虽然Redis出来蛮久了,各路高手也都提出了实践方案,但是或许 ...

随机推荐

  1. Oracle表的常用查询实验(一)

    Oracle表的常用查询实验(一) 练习1.请查询表DEPT中所有部门的情况. select * from dept; 练习2.查询表DEPT中的部门号.部门名称两个字段的所有信息. select d ...

  2. Nginx学习——http配置项解析编程

    http配置项解析编程 配置config ngx_addon_name=ngx_http_mytest_module HTTP_MODULES="$HTTP_MODULES ngx_http ...

  3. ORACLE表空间bigfile和smallfile

    BIGFILE | SMALLFILE Use this clause to determine whether the tablespace is a bigfile or smallfile ta ...

  4. JavaScript 中 关于 this 的学习笔记

    今天上午主要学习了js中的 this ,因为之前学习面向对象时,this这个东西出现的还是很频繁的,理解的很不透彻,感觉老被JAVA的思想带进坑里,所以对它特别关注. 首先贴一个大神的一篇博客,我是通 ...

  5. Gabor滤波器学习

    本文的目的是用C实现生成Gabor模版,并对图像卷积.并简单提一下,Gabor滤波器在纹理特征提取上的应用. 一.什么是Gabor函数(以下内容含部分翻译自维基百科) 在图像处理中,Gabor函数是一 ...

  6. 安装oneproxy实现数据库的读写分离

    领导就给了两台数据库,做主从,在从上搭建oneproxy插件,实现读写分离,一直就听说oneproxy,今天打算用一下 先下载最新的版本wget http://www.onexsoft.cn/soft ...

  7. 多个不同的表合并到一个datatable中,repeater在绑定datatable

    using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI ...

  8. js第四章作用域

    一.动态的属性 //创建了一个变量并且保存在了变量person中 var person = new Object(); //为该对象添加了一个名为name的属性,将字符串值‘NiCholas’赋值给n ...

  9. php实现多表(四表)连接

    <?php include_once "DBHelper.php"; define('HOST', '127.0.0.1'); define('USER', 'root'); ...

  10. java 和 Python 的互调

    http://www.cnblogs.com/lmyhao/p/3363385.html http://blog.csdn.net/wxiaow9000/article/details/5166029 ...