繁体   English   中英

C#属性实际上是方法吗?

[英]Are C# properties actually Methods?

直到现在,我认为PropertiesMethods是C#中的两个不同的东西。 但后来我做了类似下面的事情。

在此输入图像描述

这对我来说是一个“眼睛开启者”。 我期待一个属性stringProp和一个方法stringProp但我得到了这个。

为什么会这样? 请有人解释一下。

是的,编译器为属性生成一对get和set方法,并为自动实现的属性生成私有支持字段。

public int Age {get; set;}

成为相当于:

private int <Age>k__BackingField;

public int get_Age()
{
     return <Age>k__BackingField;
}

public void set_Age(int age)
{
    <Age>k__BackingField = age;
}

访问您的属性的代码将被编译为调用这两种方法之一。 这正是为什么将公共领域变为公共财产是一个突破性变化的原因之一。

请参阅Jon Skeet的“ 为什么属性重要”

严格地说,属性不是方法,虽然他们确实通过getter和setter方法(也称为存取)的支持。 当您编写这样的代码时(假设您修改代码以删除下面提到的编译错误)

myFoo.stringProp = "bar";

编译器实际生成IL代码,如下所示:

ldstr       "bar"
callvirt    foo.set_stringProp

其中set_stringProp是该属性的setter方法。 实际上,如果您愿意,可以直接通过反射调用这些方法。

但是,您发布的代码示例在Visual Studio的intellisense中可能看起来不错,但它不会编译。 尝试构建项目,您将看到如下错误:

'foo'类型已包含'stringProp'的定义

这是视觉工作室的内容问题,可以通过名字选择 顺便说一句,由于同一类型的名称冲突,您的代码甚至无法编译。

但你是对的,最后的属性方法:

public class A {

   public string Name  {get;set;}  
}

这里将Name属性转换为2个方法: get_Name()set_Name()

实际上,如果你定义这样的类:

public class A {

   public string Name  {get;set;}  

   public string get_Name() {
       return "aaa"; 
   }
}

你会得到编译错误,因为已经定义了get_Name (property)

是。 属性是mutator方法。

在计算机科学中,mutator方法是用于控制变量变化的方法。 它们也被广泛称为setter方法。 通常,setter附带一个getter(也称为accessor),它返回私有成员变量的值。

mutator方法最常用于面向对象的编程,与封装原理保持一致。 根据这个原则,类的成员变量是私有的,以隐藏和保护它们免受其他代码的攻击,并且只能通过公共成员函数(mutator方法)修改,该函数将所需的新值作为参数,可选地验证它,并修改私有成员变量。

Mutator方法也可用于非面向对象的环境中。 在这种情况下,对要修改的变量的引用将与新值一起传递给mutator。 在这种情况下,编译器不能限制代码绕过mutator方法并直接更改变量。 开发人员有责任确保变量仅通过mutator方法修改而不是直接修改。

在支持它们的编程语言中,属性提供了一种方便的替代方案,而不会放弃封装的实用性。

参考: http//en.wikipedia.org/wiki/Mutator_method

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM