5

我正在尝试创建一个将值a作为构造函数中的参数的类。它有一个存储这个值的私有成员变量。之后不应更改该值。

这就是我所拥有的,它可以工作,但我认为这不是最好的解决方案:

internal class Foo
{
    private int a;
    public int A
    {
        get
        {
            return this.a;
        }
    }

    public Foo(int a)
    {
        this.a = a;
    }
}

所以这种方式你不能a从类外部访问,并且A-property 只有一个 get 方法。但是,您仍然可以a从类内部进行更改,并使用仅返回一个变量而没有其他任何东西的属性感觉很愚蠢。

我这样做对吗,还是有办法改进我的代码/更合适的方法来做到这一点?

4

3 回答 3

6

另外声明你的私人领域readonly,你就在那里!

public class Foo
{
    public Foo(int bar)
    {
        this.bar = bar;
    }

    public int Bar
    {
        get
        {
            return bar;
        }
    }
    private readonly int bar;
}
于 2013-03-30T15:41:07.937 回答
5

“在 C# 6 及更高版本中,您可以像字段一样初始化自动实现的属性”。就像您可以在构造函数中初始化readonly字段一样,您可以在构造函数中初始化仅获取自动实现的属性。因此,以下现在编译:

public class Class1
{
    public int A { get; }
    public Class1(int a)
    {
        A = a;
    }
}

…以下会产生错误:

public class Class1
{
    public int A { get; }
    public Class1(int a)
    {
        A = a;
    }
    public void Mutate()
    {
        // Class1.cs(11,9,11,10): error CS0200: Property or indexer 'Class1.A' cannot be assigned to -- it is read only
        A++;
    }
}

我喜欢它——你可以通过属性的接口/OOP 友好性获得字段初始化的简洁性。

于 2015-07-23T14:40:27.640 回答
0
internal class Foo
{
    private readonly int _a;
    public int A 
    { 
        get
        {
            return _a;
        }
    }

    public Foo(int a)
    {
        _a = a;
    }
}

这应该这样做。

于 2013-03-30T15:42:38.553 回答