设置在具体类中的接口中定义的只读属性

Mik*_*keJ 6 c# inheritance properties interface

我有一个只读属性的接口

public interface IPerson
{
    string Name { get; }
}
Run Code Online (Sandbox Code Playgroud)

还有一个具体的课......

public class Person : IPerson
{

    public Person()
    {
        Name = "Person";
    }

    public string Name
    {
        get
        {
            return Name;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望Name只能在这个类的外部读取,但是如何在具体类中设置它?

错误:无法将Person.Name分配给.

如何在Person类中设置此属性的值?

Cha*_*ger 10

这与界面没有任何关系,你只是错误地声明属性.在C#6中,您可以创建一个只读属性,如下所示:

public class Person : IPerson
{
    public Person()
    {
        Name = "Person";
    }

    public string Name { get; }
}
Run Code Online (Sandbox Code Playgroud)

在早期版本中,您可以使用可以设置的只读后备字段:

public class Person : IPerson
{
    private readonly string _name;

    public Person()
    {
        _name = "Person";
    }

    public string Name
    {
        get { return _name; }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意,接口只需要属性有一个getter,实现不必是只读的.如果您有理由修改值,可以添加setter:

public class Person : IPerson
{
    public Person()
    {
        Name = "Person";
    }

    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如果您只需要能够从类中更改值,则setter可以是私有的.


小智 6

您可以使用私有属性来保存值.

public class Person : IPerson
{
    private string _name;
    public Person()
    {
        _name = "Person";
    }

    public string Name
    {
        get
        {
            return _name;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Lua*_*aan 5

现在,您正试图通过阅读该物业来阅读该物业.不用说,这将导致无限循环.相反,您需要使用完整的自动属性或手动后备字段.

public class Person : IPerson
{
    public Person()
    {
        Name = "Person";
    }

    public string Name { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)