繁体   English   中英

C# - 财产澄清

[英]C# - Property Clarification

根据定义:

有财产说的例子

当我宣布

 string SayHello { get; set; }  

在界面内

它在内部被挂钩为get_SayHello( ) ,set_SayHello() (当我反汇编时,我可以看到get和set方法)。

编辑:这就是我的理解。由于我是C#的新手,我正在寻求你的帮助。

你在一个有点错误的假设上操作,属性需要一个支持字段。 是的, 大多数属性使用支持字段,但这当然不是必需的。 我可以实现你的接口没有支持字段,如下所示

class C1 : IFoo {
  public string SayHello {
    get { return "Say Hello"; }
    set { }
  }
}

接口中的属性声明表明任何实现类必须具有此类方法( get_SayHelloset_SayHello但定义为属性),但未指定它们的实现方式。 也就是说,界面说明你可以做什么,但现在如何完成(所以你可以得到SayHello “字符串”,你可以设置SayHello “字符串”)。 因此,具体来说:在接口中定义属性不会说明支持字段。

此外,属性必须具有支持字段是一种误解。 以下不是:

class Example {
    public string SayHello {
        get {
            return "Hello, World!"; 
        } 
        set { }
    }
}

属性只是可通过类字段语法访问的方法。 因为它们是方法而不是字段,所以它们是可定义的接口。

正如贾里德所说,该物业并不一定需要任何存储地点......但我相信你还在过度思考它。

想象一下你的界面实际上是:

public interface IFoo
{
   string get_SayHello();
   string set_SayHello(string value);
}

只是界面中的方法。 你觉得这样吗? 如果是这样,那真正的所有属性,以及一些元数据将这些方法联系在一起。 与领域无关......只是方法。

实现者可能想要使用一个字段,但这与接口完全分开。

在接口中声明此类属性只是意味着您定义的实现接口的任何类都需要实现该属性。 这些类可以以您认为合适的任何方式自由实现该属性(作为自动属性,或通过其他更复杂的方法)。

将界面中的属性更改为以下内容:

string SayHello { get; }

实现类只需要实现该属性的getter。 但是在接口级别没有进行存储分配。

我的问题仍然是属性需要一些存储位置

事实并非如此。 你可以在getter / setter中做任何你想做的事。 通过在界面中声明属性,您只需强制实施者提供getter和/或setter。

并非所有.NET语言都具有属性的概念。 因此接口还必须定义属性的get_和set_版本,以便任何.NET语言都可以使用该类型。 这可能会增加您的困惑。

接口内部的声明只是告诉您在该接口的实例上可以存在哪些成员。 它不会告诉您它们的实现方式或保存位置。

我认为你已经将界面的概念与类的概念混淆了。 您不实例化接口,而是实现它们的类。

暂无
暂无

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

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