A field is simply a memory location, whereas, a property is a collection of methods. A
property is represented by a value, in the same way as a field. Properties can be considered
as smart fields.
It is not compulsory to store the value of a property in a field, but this is the accepted
practice. The CLR supports the syntax of properties, but these properties do not exist at
runtime.

We have created a property called ff in the class aa. This property is written as a directive
called .property in the IL file, with the modifier instance, as it is a non-static property, and
with the return type int32.
There is an accessor called get, whose equivalent directive in IL is also called as .get. This
get is represented by the function get_ff, that simply returns a value with the data type of
the property.
In this case, the br instruction is superfluous(多余的). The local variable V_0 is used to store the
return value that is to be placed on the stack.
The statement int gg = a.ff + 9; gets executed in a unique way as follows:

• The this pointer is placed on the stack.
• Then, the expression a.ff get replaced by a call to a function get_ff from the class aa.
• Thereafter, the return value is placed on the stack.
• The number 9 is placed on the stack, followed by the add instruction.
• The property gets converted into a function beginning with get.
On executing the il assembler 'ilasm' on a.il, you will see the following output

A property with a set, obtains a function called set_ff, having a parameter called value. We
also have a directive called .set.
Ldarg.1 is used to place the first parameter of a function on the stack. The call to a
property a.ff = 19 gets converted into the function call. Thus, a property actually consists
of two functions, get and set. They get called, depending on whether we want to obtain the
value of a property or change it, respectively.

Error checks in IL are sparse(稀少的). We have a property called ff, which does not have either a
get or a set directive. The C# compiler screams at this omission, but the IL assembler turns
a blind eye to this.
Hopefully, the next version of IL should have more reasonable error checks. Having said
this, henceforth, we will not comment on the lack of error checks. It will be useful to

remember in the IL world, you are on your own. The excess freedom given by the IL
assembler also means that you have to assume greater responsibility as a programmer.

A indexer is a property. It has no equivalent directive in IL. An indexer is simply a property
with an extra parameter, and no other complications. When we initialize a[1]using the
statement a[1] = 17, we are actually placing three parameters on the stack:
• The this pointer
• The array index 1
• The value 17.

Then, we call set_Item, as it is an indexer and not a property. The two parameters to the
function are i and value. If you remember, the indexer variable has been named i.
The function get_Item gets called with the single parameter i and returns a value. The first
parameter to the WriteLine function is a string and the rest of the parameters are objects.
We need to convert our int value types into objects. Thus we need to box them.
• Using the function set_Item, we are displaying the index and the value.
• Using the function get_Item, we are displaying only the value.
• Using the last WriteLine function, we are displaying the value of a[1], which is 23.
Thus, indexers are an alias for a property with an extra parameter.
The properties directive is used only by compilers and other tools, to understand as to
what methods are being associated with the property. If you are not convinced, you can
delete the property directive from the above programs and run them. There will be no
change at all in the way they execute.

The above example demonstrates the use of virtual properties. The concept of a property is
simply an illusion. As mentioned earlier, properties are converted into a series of functions.
Thus what applies to virtual functions also applies to virtual properties. We cannot use the
modifier virtual in the properties directive.
The rationale behind using a property over a field is:
If the value of a field changes, no code gets called. The class is thus, unaware of the
change. In the case of a property, a method gets called. This method can contain a large
amount of code. This code can do anything.
Also, we can be very sure that the user does not change the value of the property beyond
certain acceptable limits. A method call can be optimised, and hence, a property does not
carry any significant overhead as compared to a direct access to a field. The only
disadvantage is that the properties cannot be made global.

A property normally has a field that stores the value associated with a property. Since the
property directive is used, for documentation purposes, it would not be a bad idea to have
a directive called backing, which can be used to state the name of this field. We are not
forced to do so. The assembler only checks to make sure that the filed is present. It is not
used in any way. It must have the same data type as the property. Using the attribute
specialname, we can inform(通知) the compiler to give it special treatment.

We finally have one last directive called .other, that specifies the other functions that are
associated with the property. In this case, the assembler does not check for the existence of
the function, and thus, we have not included it.
To summarise, the properties directive is implemented as a series of method calls. The
same is true for indexers also.

C# to il 9 Properties and Indexers(属性和索引器)的更多相关文章

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

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

  2. (转)c# 属性与索引器

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

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

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

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

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

  5. 通过getResourceAsStream 获得Properties文件属性和属性值

    1.Class.getResourceAsStream(String path) path:不以‘/’开头默认是从此类所在的包下取资源:以'/'开头则是从ClassPath根目录下获取 2.Class ...

  6. SpringBoot @Value读取properties文件的属性

    SpringBoot在application.properties文件中,可以自定义属性. 在properties文件中如下示: #自定义属性 mail.fromMail.addr=lgr@163.c ...

  7. gradle-wrapper.properties中各属性的含义

    gradle-wrapper.properties中各属性的含义 1. gradle-wrapper.properties 每一个用gradle编译的工程,都会有一个gradle\wrapper目录. ...

  8. springboot成神之——application.properties所有可用属性

    application.properties所有可用属性 # =================================================================== # ...

  9. SpringBoot 获取properties配置文件的属性

    自定义properties文件获取属性 使用 @ConfigurationProperties((prefix = "demo")) 和 @PropertySource(" ...

随机推荐

  1. c/c++动态内存分配的区别

    c中动态内存分配使用malloc和free. malloc指定需要分配的内存大小,分配成功则返回指向该内存的指针,不成功则返回空指针.返回的指针类型为void *,表示不确定指针所指内存存放的数据类型 ...

  2. 了解下webpack的几个命令

    [ webpack3.0.0刚刚出来  所以文章是跟着低版本 教程 操作熟悉  结果好多对不上喔] 六:了解下webpack的几个命令 webpack         // 最基本的启动webpack ...

  3. L249 语法

    Even when homeless individuals manage to find a shelter that will give them three meals a day and a ...

  4. 点击li ,父辈出现; 子级,子辈不出现. prevUntil ---> 前面多个, 截止到 截止元素 , prev([expr]) --> 前面一个.

    要求: 1. 点击第一级   [1知识点] 的时候,  [1知识点] 前有 圆圈. 点击 第二级 [1-1知识点, 1-2知识点, 1-3知识点] 时 , [1知识点]出现 圆圈. 2. 点击 第一级 ...

  5. subprocess(子进程模块)

    subprocess: 子进程模块 一个正在运行的程序叫做进程 一个进程 开启了另一个进程 这个被开启的程序叫做子ka进程 ###########################在cmd中执行#### ...

  6. Set和Map数据结构

    1.Set ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 本身是一个构造函数,用来生成 Set 数据结构. 2.Map JavaScript 的对象 ...

  7. 首席数据官(CDO)的崛起

    数据在我们的日常生活中发挥着核心作用,几乎渗透到商业和公共部门的每一项活动中.它现在被认为是任何一个严肃组织的难题之一,可以实现从改变游戏规则的洞察到整个新技术或商业模式的诞生. 事实上,现在数据非常 ...

  8. jdk安装和环境配置

    public class test{ public static void main(String[] args){ System.out.println("hello world" ...

  9. Python学习笔记第三周

    目录 一.基础概念 1.集合 集合方法 a.设置集合 b.取交集 c.取并集 d.取差集 e.判断子集 f.判断父集 g.对称差集 基本操作: a.添加 b.删除 c.discard删除 d.长度 e ...

  10. Java中的参数列表

    一. 什么是参数列表 当你在编写一个函数时,你不知道函数形参的类型或者是形参的长度时,你就可以使用参数列表来代替. 样式: public void f(Object...objects) { Syst ...