• 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访问器方法实现对可读可写属性的操作,提供了安全和灵活的数据访问封装。比如:

    1. public class Robot  
    2. {  
    3.     private string name = "";   //字段:Field  
    4.     public string Name          //属性:Property,对Field进行封装。  
    5.       {  
    6.         get { return name; }  
    7.         set { name = value; }  
    8.     }  

    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中的作用非同凡响。

  • 相关阅读:
    B/S学习总结
    鶴山 李正浩 博士(探访墓所)
    毕业工作五年的总结和感悟(上)
    NSURLConnection经常使用的代理方法
    14.2 事务的ACID属性
    Search a 2D Matrix -- LeetCode
    ios开发之-继承的实现运用
    【Android】读取sdcard上的图片
    BZOJ 2820 YY的GCD 莫比乌斯反演
    linux写环境变量对字符转义
  • 原文地址:https://www.cnblogs.com/handsomer/p/4181752.html
Copyright © 2020-2023  润新知