C# - 财产澄清

时间:2009-09-08 15:36:20

标签: c# interface properties

根据定义:

“由于接口本身不是一个对象,我无法初始化它。如果允许接口声明文件,那么它需要存储位置,所以我们不能在接口内声明字段。”

财产说明例子

当我宣布

 string SayHello { get; set; }  
界面内的

它在内部被挂钩为IL get_SayHello( ) ,set_SayHello()(当我拆解i时 可以看到get和set方法。)

我的问题仍然是属性需要一些存储位置,那么属性声明如何

接口内允许

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

7 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:6)

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

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

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

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

答案 2 :(得分:4)

正如Jared所说,该物业并不一定需要任何存储地点......但我相信你仍然在思考它。

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

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

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

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

答案 3 :(得分:3)

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

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

string SayHello { get; }

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

答案 4 :(得分:2)

  

我的问题仍然是财产需求   一些存储位置

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

答案 5 :(得分:2)

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

答案 6 :(得分:1)

接口内部的声明只是告诉您在该接口的实例上可能存在哪些成员。它没有告诉你它们是如何实现的或它们被保存的位置。

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