C#中Property和Attribute的区别
C#中Property和Attribute的区别
Attribute 字段
Property 属性(get;set;)
属性的正常写:
private string name;
public string Name {
get { return name; }
set { name = value; }
}
简写:(自动属性)
public string Name { get; set; }
然后 编译器 会转换成 正常写法
l Property就是访问字段(成员变量,Field)提供的一种方式(set/get)
l Property是C#中引入的一种语言特性,把C++中的一些编程技巧上升到语法的地位。这种特性就是把类数据成员声明为私有的,而提供公有的方法实现对他们的访问。
l Property可以说是一个面向对象的概念,提供了对私有字段的访问封装,在C#中以get和set访问器方法实现对可读可写属性的操作,提供了安全和灵活的数据访问封装。比如:
- public class Robot
- {
- private string name = ""; //字段:Field
- public string Name //属性:Property,对Field进行封装。
- {
- get { return name; }
- set { name = value; }
- }
- }
l Property是指类向外提供的数据区域,是智能的字段,其中有get和set访问器来完成字段的取值和赋值。而Attribute则是描述对象在编译时或运行时属性的。这两者是有本质区别的,一个是属性,用于存取类的字段,一个是特性,用来标识类,方法等的附加性质。
是Attribute,还是Property?
Attribute和Property都能翻译成“属性”,有的地方用attribute表示“属性”,有的地方又在用roperty,初学者常常在这两个单词间“迷失”,甚至认为二者没有差别,是相同的。可是attribute不等于property。二者之间到底有何差别?
我们从OOA/OOD(object oriented analysis / object oriented design,面向对象分析和设计)说起。在OOA/OOD中的使用attribute表示属性,指对象(object)的特征(feature)。我们在一些编程语言(如c#、Delphi等)中遇见的“属性”一词,为何是property,而不是attribute呢? 为了理解这一点,我们把C++拽进来看看。OOA/OOD中的attribute在C++中称为member variable(成员变量),慢慢开始明白了吧。C++中的member variable在C#中能继续延用,但有了一个新的称呼:field(字段)。看一个简单的C#示例:
public class student
{ // student类
private string name; // C#中称为field(字段),C++中称为member variable(成员变量),OOA/OOD中称为attribute(属性)
}
我们整理出下表,能看到同样的概念在OOA/OOD、C++和c#中的不同称呼:
|
Description |
OOA/OOD |
C++ |
. NET(C#) /Delphi |
|
Feature |
Attribute |
Member Variable |
Field |
|
Operation |
Method |
Member Function |
Method |
OOA/OOD中的方法(method)是指对象的操作(operation)。在C++中称为member function(成员函数),而在C#中还是叫做method。在表中加入对方法(method)的称呼:
也能看出,C++中将attribute称为member variable,将method称为member function,其实还是非常贴切的。从本质上说,确实是在声明变量、定义函数。后来者(C#等)可能觉得这样的称呼不够OO(object oriented,面向对象),于是做了些改动。method延用OOA/OOD的称呼不用说,但将attribute称作field,总觉得欠妥。因为database(数据库)中有field的概念,也译作“字段”,实在是容易混淆。
目前我们能把OOA/OOD中提到的属性(attribute)同C#中提到的属性(property)区分开来。继续上面的示例:
public class student
{ // student类
private string name; // C#中称为field(字段),C++中称为member variable(成员变量),OOA/OOD中称为attribute(属性)
public string name
{ // c#中称为property(属性)
get { return name; }
set { name = value; }
}
}
我们顺便看看private和public:property本质上是一对get/set方法,能进行访问控制,因而能设置为public;而按照OOA/OOD原则,attribute不能设为public,而要设为private。
而C#中的“Attribute”则完全和OOA/OOD中的“Attribute” 完全不一样了,而是c#(net)全新引入的一个概念。
MSDN官方的解释如下:
公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型、字段、方法和属性等。Attributes和Microsoft .NET Framework文件的元数据保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为。
说的通俗些Attribute是类,不过是一类比较特殊的类,Attribute必须写在一对方括号中,用来处理.NET中多种问题:序列化、程序的安全特征等等,在.NET中的作用非同凡响。
C#中Property和Attribute的区别的更多相关文章
- C#中 property 与 attribute的区别?
C#中 property 与 attribute的区别?答:attribute:自定义属性的基类;property :类中的属性
- DOM 中 Property 和 Attribute 的区别
原文地址:http://web.jobbole.com/83129/ property 和 attribute非常容易混淆,两个单词的中文翻译也都非常相近(property:属性,attribute: ...
- [转]DOM 中 Property 和 Attribute 的区别
angular的文档: https://angular.io/guide/template-syntax#property-binding https://blog.csdn.net/sunq1982 ...
- JavaScript 中 Property 和 Attribute 的区别详解
property 和 attribute非常容易混淆,两个单词的中文翻译也都非常相近(property:属性,attribute:特性),但实际上,二者是不同的东西,属于不同的范畴. property ...
- DOM 中 Property 和 Attribute 的区别(转)
property 和 attribute非常容易混淆,两个单词的中文翻译也都非常相近(property:属性,attribute:特性),但实际上,二者是不同的东西,属于不同的范畴. property ...
- JS中property与attribute的区别
property与attirbute都是属性的意思,在JS中很容易混淆,但实际上二者有很大的区别.简单来说, property:是DOM中的属性,是JavaScript中的对像 attribute:是 ...
- C#中 property 与 attribute的区别
说的通俗些Attribute是类,不过是一类比较特殊的类,Attribute必须写在一对方括号中,用来处理.NET中多种问题:序列化.程序的安全特征等等,在.NET中的作用非同凡响 Attribute ...
- DOM中 property 和 attribute 详解
被问到 property 和 attribute 的区别,想来也是要好好看一下. 一.基本概念区别 其实Attribute和Property这两个单词,翻译出来都是“属性”,<js高级程序设计& ...
- Property 和 Attribute 的区别(转)
property 和 attribute非常容易混淆,两个单词的中文翻译也都非常相近(property:属性,attribute:特性),但实际上,二者是不同的东西,属于不同的范畴. property ...
随机推荐
- 关于.net根目录路径的问题
今天做了一个项目,用了url重写,但是在本地目录是localhost/BK/index.aspx,而其他目录也必须带bk,不带的话就找不到页面,(iis里正常) 应该主目录去掉bk,设置方法,右击网站 ...
- 页面传值中get和post区别
get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应. post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到 ...
- Objective-C Delegate
ios设计模式中的委托 Delegate 官方文档解释如下: Delegation is a simple and powerful pattern in which one object in a ...
- javascrip中setTimeout和setInterval
1: http://www.jb51.net/article/68258.htm 2: http://www.jb51.net/article/26679.htm
- Sicily 2005.Lovely Number
题目地址:2005.Lovely Number 思路: 若测试数据出现的次数为奇数,则输出它. 所以,可以先排序,若前后相等,前后都设为0,最后不为0的则可以输出. 具体代码如下: #include ...
- Java protobuf框架使用向导
ProtoBuf,全称是Protocol Buffers, 它是谷歌内部用的一种高效的.可扩展的对结构化数据进行编码的格式规范.谷歌自己内部很多程序之间的通信协议都用了ProtoBuf. 下面介绍的是 ...
- asp.net 的那点事(2、浏览器和一般处理程序)
从今天开始我们接着来学习:asp.net中一般处理程序和浏览器的通信. 一.第一个图解: 从图解中我们看出,整个过程是:"请求---处理---响应".这个也就是经常面试的时候,面试 ...
- IOS 播放音频流媒体
#pragma mark - 加载播放数据 - (void)loadData:(NSString *)musicUrl { NSURL *playURL = [NSURL URLWithString: ...
- 转发细节——forward
1)forward()方法之前的输出,如果是输出到缓冲区,再转发到其它Servlet,那么原缓冲区的数据忽略不计:2)forward()方法之前的输出,如果真正输出到浏览器,再转发到其它Servlet ...
- C# 进程间通信(共享内存)
原文:C# 进程间通信(共享内存) 进程间通信的方式有很多,常用的方式有: 1.共享内存(内存映射文件,共享内存DLL). 2.命名管道和匿名管道. 3.发送消息 本文是记录共享内存的方式进行进程间通 ...