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

一个简单的示例:

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. webstorm 安装与基本使用

    1.1 webstorm 安装与配置 1.安装: https://blog.csdn.net/jiangxinyu50/article/details/79104016 2.使用: https://w ...

  2. es破解xpack

    环境:OS:CentOS 7elasticsearch:6.5.0 1.vim LicenseVerifier.java package org.elasticsearch.license; impo ...

  3. phpstorm 一个窗口打开多个项目

    参考:https://imshusheng.com/php/135.html 文件 -> 设置 -> 项目"XXX" -> Directories- > A ...

  4. QML的Window与ApplicationWindow

    ApplicationWindow需要导入QtQuick.Controls Window需要导入QtQuick.Window . 默认不可见,需要设置visible:true才可见. 主要区别就是Ap ...

  5. linux内核中的hisi_sas是什么?

    答: 是一个HISILICON SAS 控制器驱动(HISILICON SAS controller driver)

  6. 【lg1799】数列

    题目描述 虽然msh长大了,但她还是很喜欢找点游戏自娱自乐.有一天,她在纸上写了一串数字:1,l,2,5,4.接着她擦掉了一个l,结果发现剩下l,2,4都在自己所在的位置上,即1在第1位,2在第2位, ...

  7. utf-8并不"兼容" gb2312, gb18030

    注意 utf-8 并不是 向下 兼容"gb2312 gb18030"等编码, 也并不是说, utf-8就是比 gb2312等高级的编码! 比如在terminal中, 你开始使用的 ...

  8. POJ 3087 Shuffle'm Up(洗牌)

    POJ 3087 Shuffle'm Up(洗牌) Time Limit: 1000MS    Memory Limit: 65536K Description - 题目描述 A common pas ...

  9. SAP应用创新-维护控制表、视图统一路径

    SAP应用创新-维护控制表.视图统一路径 背景: Sap 里面通过技术支持人员维护表的值控制业务操作的表不少,一般通过事物代码或记录在系统外的文档或在某个程序上放置一个按钮.缺点:分散,不易记,不好找 ...

  10. 20165306学习基础和C语言基础调查

    20165306学习基础和C语言基础调查 技能学习心得 我认为兴趣.责任感.毅力对技能的获得非常重要. 因为我从小五音不全.肢体不协调,所以看春晚等节目的时候会把更多的关注点放在主持人身上.小时候觉得 ...