属性允许源代码用一个简单的语法来调用一个方法。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{...}
}
}
分享到:
相关推荐
在Qt框架中,属性系统是其核心特性之一,它允许开发者方便地定义、设置和获取对象的属性。这个系统使得编程更加直观,特别是在处理UI组件和自定义组件时。本教程将深入探讨如何使用Qt属性表来设置和获取属性,并通过...
NX 制图中常用非属性表中属性 NX 制图中,属性非常重要,尤其是在制图环境下。在制图中,明细表、标题栏都是跟属性关联的,当属性更新,明细表或标题栏也会随之更新过来。 UG 制图中常用非属性表中属性,可以分为...
在ArcGIS中,属性表是用于管理地理空间数据的关键工具,它存储了关于地图要素的各种信息。当你需要在属性表中选择同一属性的多个值时,这是一个常见的编辑任务,尤其在进行批量处理或数据分析时。以下是一份详细的...
Visual Studio 2019(VS2019)是微软开发的一款强大的集成开发环境,其属性配置是项目构建和调试过程中的关键环节。本文将深入探讨如何在VS2019中进行属性配置,以便更好地管理和优化你的项目。 首先,我们来看如何...
在IT领域,文件属性是每个计算机文件不可或缺的一部分,它们提供了关于文件的重要元数据。文件属性信息提取工具是一种实用软件,能够帮助用户检索并修改这些属性,以满足特定的需求。下面我们将详细探讨文件属性、...
例如,同一款手机可能有不同的颜色、内存容量等属性,这些不同的组合就形成了不同的SKU。在商品管理中,一个复杂的挑战是如何设计一个有效的SKU多属性选择算法,确保用户能方便地筛选和购买符合他们需求的商品。这里...
粗糙集属性约简是数据挖掘领域中的一个重要概念,它源于粗糙集理论,由波兰科学家Zdzisław Pawlak在1982年提出。粗糙集理论是一种处理不完全信息系统的数学工具,它允许我们在不完全或不确定的数据上进行知识发现和...
在IT领域,文件属性是操作系统用来标识和管理文件的关键信息,包括文件的创建日期、修改日期、访问日期、文件大小、文件类型以及权限等。在Windows操作系统中,用户可以通过特定的方式来修改文件的属性以满足不同的...
VB控件属性大全【珍藏版】 1.01、窗体(FORM)的常用属性 2 1.02、标签控件(Lable)的常用属性 7 1.03、文本框控件(TextBox)的常用属性 9 1.04、框架控件(Frame)的常用属性 13 1.05、命令按钮控件(CommandButton)的...
属性表是GIS数据的重要组成部分,它存储了与几何数据(如点、线、面)相关的属性信息。这些属性可以是关于地物的名称、类型、面积等描述性数据。在ArcEngine中,我们可以使用`ITable`接口来访问和操作属性表。 1. *...
属性约简是粗糙集理论中的核心概念,它用于在不丢失关键信息的前提下,减少数据集中的属性数量,从而简化模型,提高处理效率和解释性。MATLAB作为一种强大的数学计算和编程环境,常被用于实现各种算法,包括粗糙集...
### CAD块属性批量修改 #### 引言 在CAD(计算机辅助设计)领域,块是图形元素的一种集合,常用于创建复杂的设计结构。块中可以包含属性,这些属性能够存储额外的信息,例如零件编号、材料类型等。在大型项目中,...
标题“ARCGIS批量导入属性内容”所涉及的知识点主要包括在ARCGIS软件中批量导入属性表数据的操作方法,这一过程的目的是为了将大量属性信息快捷、方便、省事地导入到ARCGIS的属性表中,并且尽量减少错误。...
【南方CASS Xdata扩展属性】是南方测绘软件CASS(Computer Aided Surveying and Mapping)中的一个重要功能,主要用于在GIS(地理信息系统)中增加自定义的数据字段,以满足用户对于地形图、地籍图等测绘数据的精细...
它不仅提供了强大的三维设计功能,还具备了丰富的数据管理能力,使得设计师能够方便地在零件模型中添加各种属性,如材料、重量、成本等,这些属性对于后续的产品数据管理、成本估算、生产计划等环节至关重要。...
**Qt属性表控件——QtPropertyBrowser** QtPropertyBrowser是一种在Qt框架下实现的属性表控件,它允许用户以树形结构展示和编辑对象的属性。这个控件类似于QtCreator中的属性设置以及Visual Studio中的属性窗口,为...
质量属性效用树(Utility Tree)是软件架构评估和决策中的一个重要工具,它用于系统地分析和量化质量属性,如性能、安全性、可用性、可维护性等,以支持架构设计决策。在软件开发过程中,质量属性是衡量系统好坏的...
在工作生产过程中,我们常常需要在cad及arcgis的shp格式之间进行数据转换,但是由于cad数据和arcgis数据的属性储存方式有着本质上的区别,所以我们很难在不借助其他扩展软件的辅助下进行直接转换。当然,在实际应用...
### Qt编写的自定义控件属性设计器 #### 概述 在进行图形用户界面(GUI)开发时,自定义控件及其属性管理是一项常见的需求。特别是在工业自动化与控制领域,为了适应特定的应用场景,如仪表盘设计、状态监控界面等...