Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c语言中与getter和setter的接口#_C#_Interface_Getter - Fatal编程技术网

C# c语言中与getter和setter的接口#

C# c语言中与getter和setter的接口#,c#,interface,getter,C#,Interface,Getter,正如我在这里读到的 可以在界面中设置get,但不能设置set 或者,如果我想在接口中使用getter和setter,是否因为新语法不适合接口语法,就必须使用旧语法getVarsetVar 更新:如果我必须在接口中省略set,这是否意味着我不能强制类拥有setter,因为在这种情况下,我只能部分强制实现接口的目的?如果您只想让get可用,只需使用{get;private set;} 上一个示例中显示的类是可变的。客户端代码可以在对象创建后更改对象中的值。在包含重要行为(方法)和数据的复杂类中,通

正如我在这里读到的

可以在界面中设置
get
,但不能设置
set

或者,如果我想在接口中使用getter和setter,是否因为新语法不适合接口语法,就必须使用旧语法
getVar
setVar


更新:如果我必须在接口中省略
set
,这是否意味着我不能强制类拥有setter,因为在这种情况下,我只能部分强制实现接口的目的?

如果您只想让get可用,只需使用
{get;private set;}

上一个示例中显示的类是可变的。客户端代码可以在对象创建后更改对象中的值。在包含重要行为(方法)和数据的复杂类中,通常需要具有公共属性。但是,对于仅封装一组值(数据)且很少或没有行为的小型类或结构,建议通过将set访问器声明为private使对象不可变。有关更多信息,请参见如何:使用自动实现的属性实现轻量级类(C#编程指南)

在自动实现的属性上允许使用属性,但在支持字段上显然不允许使用属性,因为这些属性无法从源代码访问。如果必须在属性的支持字段上使用属性,只需创建常规属性即可


是的,只需省略
set。例如:

interface IName
{
    string Name { get; }
}

事实上,答案是上述答案的混合:省略接口上的setter,并使用
get;私人设置

您可以使用属性语法。使用以下组合:

interface ISomething
{
    string Test { get; }
}

class Something : ISomething
{
    public string Test { get; private set; }
}
当然,您可以在Something.Test中为getter添加完整的实现,如果您选择的话。为了简洁起见,我只使用了支持字段

请记住,接口定义了您必须实现的最基本的内容集。您可以在上面添加任何您想要的肉汁(新方法、访问器、成员等)。您甚至可以添加一个公共setter:

interface ISomething
{
    string Test { get; }
}

class Something : ISomething
{
    public string Test { get; set; } // Note that set is public
}

唯一的限制是某人不能使用你添加的肉汁,除非他们有一个具体类型的引用(类,而不是接口),或者一个定义你添加的方法的不同接口。

否。我想你误解了。这篇文章是关于有一个带有只读属性(只有getter的属性)的接口的可能性。但是,如果需要,也可以将setter放在接口中:

interface IHasProperty
{
    string Property{ get;set; }
}
class HasProperty:IHasProperty 
{
    public string Property{ get;set; }
}
你误解了。 根据文章,您不能在界面上使用访问修饰符

您可以在接口属性中使用get和set

请参见以下MSDN示例:


我认为user310291是在询问是否可以在接口中放置setter,而不是是否可以省略itAndrea是正确的:如果必须在接口类中省略set,这是否意味着我不能将类强制为setter,因为在这种情况下,setter会破坏接口类的目的,因为我只能部分强制?@user310291:看看我答案中的代码:在接口中放置getter是绝对可能的。+1到目前为止,您似乎是唯一一个回答OP问题的人。非常感谢。我也会给你一个很好的答案,但只能选择一个,所以选择了我看到的第一个。@user310291:你发现使用我的答案对我来说已经足够了:)