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

一个简单的示例:

public class Person

{

  private string _name = "No one";

  public Person(string name)

  {

    _name = name;

  }

  public string Name

  {

    get { return _name;}

  }

};

用法:

Person p = new Person ("Arya");

System.Console.WriteLine (p.Name);

这里Name是一个只读的属性,如果要给Name赋值,那么就会报错。

那么就需要在Name里添加set访问器

public string Name

{

  get { return _name;}

  set { _name = value;}

}

value是set访问器的隐式参数,此参数的类型是属性的类型(string)。

用法:

p.Name = "Erya";

索引器允许类或结构的实例就像数组一样进行索引。 索引器类似于属性,不同之处在于它们的取值函数采用参数。

在Person类里添加一个索引器:

public string this[string key]

{

  get { if (key == "Name")

  return _name;

  return null;}

  set { if (key == "Name")

  _name = value;

  return;}

}

跟属性一样,索引器可以只有set访问器或者get访问器,或者二者都有,不过,索引器可输入参数。

用法:

p ["Name"] = "Anonymous";

System.Console.WriteLine (p ["Name"]);

属性和索引器的区别:

属性

索引器

允许像调用公共数据成员一样调用方法。

允许对一个对象本身使用数组表示法来访问该对象内部集合中的元素。

可通过简单的名称进行访问。

可通过索引器进行访问。

可以为静态成员或实例成员。

必须为实例成员。

属性的 get 访问器没有参数。

索引器的 get 访问器具有与索引器相同的形参表。

属性的 set 访问器包含隐式 value 参数。

除了value参数外,索引器的 set 访问器还具有与索引器相同的形参表。

支持对自动实现的属性使用短语法。

不支持短语法。

所谓自动实现属性的短语法,就是一个属性可以写成下面这种方式:

public int Age { get;set;}

而这种写法妙用就在于可以写成这样:

public int Age { get;private set;}

即对外只读,对内可写。

或者

protected int RealAge{ private get; set;}

即对自己或派生类可写,对自己可读。

对于属性和索引器,get和set至少要有一个不添加访问修饰符,可访问性与自身相同,而另一个可以添加低于自身的访问修饰符。

接着为Person添加一个派生类:

public class Coder : Person

{

  public new int Age {get{ return 10;}}

  public new string this[string key]

  {

    get {if (key == "Name")

    return "I don't know.";

    return null;}

  }

}

这里我们使用new关键字声明了一个同名的属性Age和同名的索引器。当我们调用这个属性和索引器时:

Coder c = new Coder();

System.Console.WriteLine (c.Age);

System.Console.WriteLine (c["Name"]);

会显示10和I don't know.

当然我们也可以时间倒流并找回自己的名字。

System.Console.WriteLine (((Person)c).Age);

System.Console.WriteLine (((Person)c)["Name"]);

显示0和No one。

既然有了派生类,我们就可以写虚属性和虚索引器了。

例如在Person里添加:

public virtual bool Male {

  get;

  set;

}

public virtual bool this[bool noSense]

{

  get { return noSense;}

}

在Coder里面添加

public override bool Male

{

  get { return true;}

  set { }

}

public override bool this[bool noSense]

{

  get { return !noSense;}

}

注意:在重写属性或索引器时,被重写的访问器对重写代码而言,必须是可访问的。此外,属性或索引器和访问器的可访问性级别都必须与相应的被重写属性或索引器和访问器匹配。

重写虚属性或索引器的属性还可以是 sealed 的,这表示它对派生类不再是虚拟的。并且,可以将抽象类的属性或索引器声明为 abstract。这意味着类中没有任何实现,派生类必须编写自己的实现。

说了这么多,发现属性和索引器有很多相似的地方,那么就再加点不一样的。

例如:

static public string Planet

{

  get { return "The Earth";}

}

索引器无法是静态成员。

再例如:

public int this[int a, int b]

{

  get { return a + b;}

}

索引器可以有多个参数(属性连一个参数都没有……),参数类型也不受限于int和string。

最后补一发访问修饰符:

public

同一程序集中的任何其他代码或引用该程序集的其他程序集都可以访问该类型或成员。

private

只有同一类或结构中的代码可以访问该类型或成员。

protected

只有同一类或结构或者此类的派生类中的代码才可以访问的类型或成员。

internal同一程序集中的任何代码都可以访问该类型或成员,但其他程序集中的代码不可以。

protected internal

由其声明的程序集或另一个程序集派生的类中任何代码都可访问的类型或成员。 从另一个程序集进行访问必须在类声明中发生,该类声明派生自其中声明受保护的内部元素的类,并且必须通过派生的类类型的实例发生。

关于数组的属性测试:

        public class ArrayAttributeTest
{
public byte[] buffer { get; private set; } public byte[] buffer1; public ArrayAttributeTest()
{
buffer = new byte[10];
buffer1 = new byte[10];
}
} static void Main(string[] args)
{
ArrayAttributeTest test = new ArrayAttributeTest();
test.buffer[0] = 1;  //不会报错
test.buffer[1] = 2; //test.buffer = test.buffer1;  //这句会报错

        }

  将buffer数组设置为对外可读对内可写,测试表明外部可以对数组元素赋值但是不能赋值为另外一个数组

文章转载自:https://blog.csdn.net/ecidevilin/article/details/52525080

(转)c# 属性与索引器的更多相关文章

  1. C#中方法,属性与索引器

    C#中方法,属性与索引器: TODO: 1,关于系统中常常出现的通过某一字段,查询相应实体信息(可能是一条字段或一条数据和一组泛型集合) 解说篇:1,方法,2,属性3.索引器 1.方法(1.依据状态编 ...

  2. set,get方法(属性,索引器)

    很多时候我们不可以把一些字段暴露出来允许别人调用和修改,为了隐藏这些字段又便于加限制的使用,在面向对象编程中一般采用写get set函数的办法,比如: //字段_age, "_"表 ...

  3. C# to il 9 Properties and Indexers(属性和索引器)

    A field is simply a memory location, whereas, a property is a collection of methods. Aproperty is re ...

  4. C#属性-索引器-里氏替换-多态-虚方法-抽象-接口-泛型-

    1.属性 //属性的2种写法 public class person { private string _name; public string Name { get { return _name; ...

  5. C# 类中索引器的使用

    索引器(Indexer)是C#引入的一个新型的类成员,它使得类中的对象可以像数组那样方便.直观的被引用.索引器非常类似于属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用.定义 ...

  6. C#中索引器的作用和实现。

    官方描述:索引器允许类或结构的实例就像数组一样进行索引.索引器形态类似于,不同之处在于它们的取值函数采用参数. 这一功能在创建集合类的场合特别有用,而在其他某些情况下,比如处理大型文件或者抽象有些资源 ...

  7. 如何使用T-SQL备份还原数据库及c#如何调用执行? C#中索引器的作用和实现。 jquery控制元素的隐藏和显示的几种方法。 localStorage、sessionStorage用法总结 在AspNetCore中扩展Log系列 - 介绍开源类库的使用(一) span<T>之高性能字符串操作实测

    如何使用T-SQL备份还原数据库及c#如何调用执行? 准备材料:Microsoft SQL Server一部.需要还原的bak文件一只 一.备份 数据库备份语句:user master backup ...

  8. C# 中常用的索引器

    使用 C# 中的索引器和 JavaScript 中访问对象的属性是很相似. 之前了解过索引器,当时还把索引器和属性给记混了, 以为索引器就是属性,下面写下索引器和属性的区别,以及怎么使用索引器 先说明 ...

  9. 接口、索引器、Foreach的本质(学习笔记)

    接口 什么是接口? 接口代表一种能力,和抽象类类似但比抽象类的抽象程度更高! 接口的定义: public interface IEat//定义一个接口 { void Eat(string food); ...

随机推荐

  1. Python爬虫(一)——豆瓣下图书信息

    爬虫目的: 随着近年互联网的发展,网络上的信息飞速数量增长.在庞大的数据面前想要获得期望的信息往往如同大海捞针.通过合理的筛选,在百万甚至数亿计的数据中找到所需信息,无疑有着非常大的意义. 在豆瓣网下 ...

  2. LOIC

    Pre: http://sourceforge.net/projects/loic Getting the Software To DDos, first your going to have to ...

  3. javaScript随机数取值方法

    Math.random()方法返回0到1之间的一个随机数,不包括0和1 如若想取的一个范围的随机数可套用下面的公式: 一.X+开始数-1=结束数 二.Math.floor(Math.random()* ...

  4. html 之 table cellpadding,cellspacing

    单元格(cell) -- 表格的内容 单元格边距(表格填充)(cellpadding) -- 代表单元格外面的一个距离,用于隔开单元格与单元格空间 单元格间距(表格间距)(cellspacing) - ...

  5. activiti 5.13流程图连线名称不显示bug修复

    使用modeler设计器,流程图连线名称是有显示的,但是运行结果却没显示.找到网上2遍文章,说是activiti框架中的一个bug,要修改 DefaultProcessDiagramGenerator ...

  6. Hadoop【单机安装-测试程序WordCount】

    Hadoop程序说明,就是创建一个文本文件,然后统计这个文本文件中单词出现过多少次! (MapReduce 运行在本地   启动JVM ) 第一步    创建需要的文件目录,然后进入该文件中进行编辑 ...

  7. ISTQB学习笔记

    学习ISTQB大纲此文记录初次阅读时不够明确的地方 第一章:软件测试基础1. 引起软件缺陷的原因人都会犯错误(error,mistake),因此人设计的代码或文档中会引入缺陷(defect, faul ...

  8. error: could not create '/System/Library/Frameworks/Python.framework/Versions/2.7/share': Operation not permitted

    参考: Python pip安装模块报错 Mac升级到EI Captain之后pip install 无法使用问题 error: could not create '/System/Library/F ...

  9. JavaScript——执行环境、变量对象、作用域链

    前言 这几天在看<javascript高级程序设计>,看到执行环境和作用域链的时候,就有些模糊了.书中还是讲的不够具体.通过上网查资料,特来总结,以备回顾和修正. 目录: EC(执行环境或 ...

  10. SpringBoot war包部署到Tomcat服务器

    (1)pom.xml文件修改<packaging>war</packaging>,默认是jar包,<build>节点中增加<finalName>spri ...