`

属性

    博客分类:
  • CLR
 
阅读更多

属性允许源代码用一个简单的语法来调用一个方法。CLR支持两种属性:无参属性 和 有参属性(C#里称为 索引器)

 

无参属性

数据封装是面向对象设计和编程中的一个重要的原则,它意味着类型的字段永远不应该公开,应为这样很容易写出不恰当的使用字段的代码,从而破坏对象的状态。 如:

public class Employee{

public String Name;

public Int32 Age;

}

Employee e=new Employee();    e.Age=-5;

可以使用属性

public class Employee{

private String m_Name;

private Int32 m_Age;

public Int32 Age{

get{return m_Age;}

set{  if(value>0){m_Age=value;} }

 }

}

每个属性都有一个名称和一个类型(不能是void)  属性不能重载,就是说,不能定义名称相同、类型不同的两个属性。

get和set方法不一定要访问支持字段。

其实编译器在编译时会将每个访问器方法写成一个单独的方法,在前面加get_或set_  本处就是get_Age() 和 set_Age(Int32 value)

C#还支持一种简单的语法称为自动实现的属性(AIP)  如下:

public class Employee{

public String Name{get;set;}

}

由于AIP没有提供get和set的实现,C#会自动为你声明一个私有字段,该字段名称是由编译器决定的,而且每次重新编译代码,它都可能更改这个名字。这样一来,任何类型只要含有一个AIP,便没办法对该类型的实现进行反序列化了。

关于对象和集合初始化器 匿名类型 看这里

需要补充的是

集合初始化器语法的使用,必须是该集合类提供了Add方法才行。

编译器在构建匿名类型时还会重写Object的Equals、GetHashCode、ToString方法。前两个方法使匿名类型的实例可以放到一个哈希表集合中。

上面链接里讲的匿名类型有一些错误:编译器创建匿名类型时,生成的无参属性是只读的(没有set访问器),匿名类型的字段的初始化是通过构造函数来初始化的。所以匿名类型一经创建(通过构造函数初始化字段)就不可变了(所有属性都是只读的)

有参属性(索引器)

public class Employee{

private String m_Name;

public String this[int i]{

   get{ if(i>0){return m_Name;} }

   set{ if(i<0){m_Name=value;}}

  }

}

Employee e=new Employee();  string s= e[1];    e[2]="value";

编译器编译索引器时原始代码可能如下:

public class Employee{

private String m_Name;

public String get_Item(int i){...}

public String set_Item(int i,string value){...}

}

所以索引器的get访问器接受一个或多个参数(本处至少有一个int i)  set访问器接受两个或多个参数(本处至少有一个int i和一个value)

索引器至少要有一个参数(本处是int i),但可以更多。 参数和返回类型可以是除了void以外的任何类型。

C#编译器默认的索引器的访问器名称是get_Item和set_Item,因为声明索引器时不像无参属性那样可以由开发人员命名,只能是this[...]。  但可以通过向索引器应用System.Runtime.CompilerServices.IndexerNameAttribute定制attribute来重命名这些索引器的访问器名称:

public class Employee{

[IndexerName("Str")]

public String this[int i]{...}

}

这样编译的访问器名称将是get_Str和set_Str

在C#中,一个类型可定义多个索引器,只要索引器的参数集不同,如下由于参数集相同,所以不能通过编译。

public class Employee{

public int32 this[Boolean b]{...}

public String this[Boolean b]{...}

}

可以为get和set设置不同的访问性

public class Employee{

private String m_Name;

public String Name{

  get{...}

  protected set{...}

  }

}

分享到:
评论

相关推荐

    shape属性转换CAD扩展属性

    本主题的核心是"shape属性转换CAD扩展属性",这是一项将ESRI的Shapefile(SHP)格式的属性数据转换为CAD(计算机辅助设计)文件扩展属性的过程。下面我们将深入探讨这一过程以及相关的技术细节。 首先,Shapefile是...

    500种常用材料属性,材料的属性,Abaqus

    本文将深入探讨“500种常用材料属性”这一主题,结合Abaqus材料库的使用,帮助你更好地理解和应用各种材料的特性。 首先,材料属性是描述材料力学性能的关键数据,包括弹性模量E、泊松比ν、剪切模量G、屈服强度σy...

    qt 属性表,设置属性和获取属性例子

    在Qt框架中,属性系统是其核心特性之一,它允许开发者方便地定义、设置和获取对象的属性。这个系统使得编程更加直观,特别是在处理UI组件和自定义组件时。本教程将深入探讨如何使用Qt属性表来设置和获取属性,并通过...

    UG制图中常用非属性表中属性

    NX 制图中常用非属性表中属性 NX 制图中,属性非常重要,尤其是在制图环境下。在制图中,明细表、标题栏都是跟属性关联的,当属性更新,明细表或标题栏也会随之更新过来。 UG 制图中常用非属性表中属性,可以分为...

    依赖属性实现绑定

    在WPF(Windows Presentation Foundation)开发中,依赖属性(Dependency Property)是实现数据绑定的关键机制。依赖属性允许控件的属性与其他对象的数据源保持同步,从而实现数据驱动的用户界面。接下来,我们将...

    C#控件常用属性方法

    ### C#控件常用属性方法 #### 1、窗体 **常用属性** - **Name属性**:用于获取或设置窗体的名称。这在应用程序中非常重要,因为可以通过`Name`属性来引用窗体。 - **WindowState属性**:用于获取或设置窗体的窗口...

    [1]arcgis属性表中选择同一属性的多个值.docx

    在ArcGIS中,属性表是用于管理地理空间数据的关键工具,它存储了关于地图要素的各种信息。当你需要在属性表中选择同一属性的多个值时,这是一个常见的编辑任务,尤其在进行批量处理或数据分析时。以下是一份详细的...

    VS2019属性配置详解

    Visual Studio 2019(VS2019)是微软开发的一款强大的集成开发环境,其属性配置是项目构建和调试过程中的关键环节。本文将深入探讨如何在VS2019中进行属性配置,以便更好地管理和优化你的项目。 首先,我们来看如何...

    文件属性提取修改工具

    在IT领域,文件属性是每个计算机文件不可或缺的一部分,它们提供了关于文件的重要元数据。文件属性信息提取工具是一种实用软件,能够帮助用户检索并修改这些属性,以满足特定的需求。下面我们将详细探讨文件属性、...

    粗糙集属性约简

    粗糙集属性约简是数据挖掘领域中的一个重要概念,它源于粗糙集理论,由波兰科学家Zdzisław Pawlak在1982年提出。粗糙集理论是一种处理不完全信息系统的数学工具,它允许我们在不完全或不确定的数据上进行知识发现和...

    修改文件 属性.rar

    在IT领域,文件属性是操作系统用来标识和管理文件的关键信息,包括文件的创建日期、修改日期、访问日期、文件大小、文件类型以及权限等。在Windows操作系统中,用户可以通过特定的方式来修改文件的属性以满足不同的...

    VB控件属性大全【珍藏版】

    VB控件属性大全【珍藏版】 1.01、窗体(FORM)的常用属性 2 1.02、标签控件(Lable)的常用属性 7 1.03、文本框控件(TextBox)的常用属性 9 1.04、框架控件(Frame)的常用属性 13 1.05、命令按钮控件(CommandButton)的...

    ArcEngine 属性表操作

    属性表是GIS数据的重要组成部分,它存储了与几何数据(如点、线、面)相关的属性信息。这些属性可以是关于地物的名称、类型、面积等描述性数据。在ArcEngine中,我们可以使用`ITable`接口来访问和操作属性表。 1. *...

    属性约简 matlab程序

    属性约简是粗糙集理论中的核心概念,它用于在不丢失关键信息的前提下,减少数据集中的属性数量,从而简化模型,提高处理效率和解释性。MATLAB作为一种强大的数学计算和编程环境,常被用于实现各种算法,包括粗糙集...

    南方cass xdata 扩展属性

    【南方CASS Xdata扩展属性】是南方测绘软件CASS(Computer Aided Surveying and Mapping)中的一个重要功能,主要用于在GIS(地理信息系统)中增加自定义的数据字段,以满足用户对于地形图、地籍图等测绘数据的精细...

    Arcgis 属性表中添加下拉选择项步骤(含截图)

    ### ArcGIS属性表中添加下拉选择项的详细步骤 #### 一、引言 在进行地理信息系统(GIS)的数据管理与编辑时,经常会遇到需要为大量相同类型的要素(如地块、道路等)填写相似属性的情况。例如,在土地利用分类项目...

    分析-质量属性效用树.

    质量属性效用树(Utility Tree)是软件架构评估和决策中的一个重要工具,它用于系统地分析和量化质量属性,如性能、安全性、可用性、可维护性等,以支持架构设计决策。在软件开发过程中,质量属性是衡量系统好坏的...

    Qt属性表控件-QtPropertyBrowser

    **Qt属性表控件——QtPropertyBrowser** QtPropertyBrowser是一种在Qt框架下实现的属性表控件,它允许用户以树形结构展示和编辑对象的属性。这个控件类似于QtCreator中的属性设置以及Visual Studio中的属性窗口,为...

    arcgis要素转CAD带属性工具

    在工作生产过程中,我们常常需要在cad及arcgis的shp格式之间进行数据转换,但是由于cad数据和arcgis数据的属性储存方式有着本质上的区别,所以我们很难在不借助其他扩展软件的辅助下进行直接转换。当然,在实际应用...

    WPF依赖项属性示例

    1. **属性系统**:WPF的属性系统不同于传统.NET类中的属性,依赖项属性是由系统管理的,可以实现高级特性如数据绑定、属性更改通知和动画等。 2. **注册依赖项属性**:每个依赖项属性都需要在类中注册,注册时需...

Global site tag (gtag.js) - Google Analytics