没有允许的属性(只读属性)如何在类中设置?什么机制?

时间:2018-03-04 12:45:41

标签: c#

首先,我并不熟悉C#,但我使用的是C ++。我没有找到任何关于此的信息。通过什么机制,当只有一个get实现并且隐藏了set时,正在设置C#属性。它是一个只读属性,在循环内连续设置。

我的预感是get返回一个引用,在这种情况下C#用它来设置值。这是对的吗?

(我遇到了一个我想要了解的代码)

例如:

public Series<double> Avg
{
    get { return Values[1]; }
}

public Series<double> Default
{
    get { return Values[0]; }
}

(系列只是一个双精度数组,但是通过索引从数组的末尾访问它们)

RSI中的代码确实写了数组的项目:

Default[0]  = value0;
Avg[0]      = constant1 * value0 + constant2 * Avg[1];

那么那里发生了什么?只是为了理解,它类似于下面的C ++代码?

double& Avg(int index)
{
    return Values[index+1];
}

当然,在C ++中你会使用Avg(1)而不是Avg[1],因为它是一个函数,我只是好奇逻辑在@ RSI.cs中的实际作用。在这种情况下,get是否像引用一样,所以它也可以通过get写入值,或者set是自动实现的,所以写入和读取上面的属性是访问一个完全不同的索引甚至变量?

以上C#样本是否都是有效的C#代码?

4 个答案:

答案 0 :(得分:3)

这意味着您只能读取属性的值,但不能从外部写入。

以文件类为例。它有一个你可以从外面读取的属性FileSize。拥有Setter是没有意义的,因为设置文件大小是不可能的(你必须修改文件的内容才能改变文件大小)。

然后,您将以以下形式实现只读属性:

public long FileSize { get { return Content.Length; } }

您可以将C#属性与一组C ++方法进行比较。 get将是C ++类中的getProperty()方法,而set将是setProperty(value)。 C#属性实际上与拥有字段和两个方法没有太大区别。整个get和set只是让编译器为你生成这个的好方法。

答案 1 :(得分:1)

这意味着这是一个属性,您希望从对象外部读取它而不进行修改,例如,您可以这样做:

public class MyObject
{
    private string _currentState;//This will be changed only from inside class
    public string MyCurrentState
    {
       get
       {
         return _currentState;
       }
    }
}

答案 2 :(得分:-1)

由于您对c ++更熟悉,让我尝试以某种方式翻译它。原谅我任何细节错误,因为我已经有一段时间了,因为我经常使用C ++。

template<class T> class Series
{
    // some template class definition

    // the index operator in c++
    T& operator [](int idx) 
    {
        return somePrivateTArray[idx];
    }
}

class UserOfSeries
{
    Series<double> Values[]; // = ... somewhere

public:
    Series<double>& Avg()
    {
        return Values[1];
    }

    Series<double>& Default()
    {
        return Values[0];
    }
}

当你使用它时,你可能会写

UserOfSeries* aUserOfSeries = getUserOfSeriesFromTheSystem();
Series<double>& theAvg = aUserOfSeries->Avg();
theAvg[4] = 12000.000;

答案 3 :(得分:-2)

您可以设置没有设置的属性。它只表示您无法从课外访问它(可见性)。在课堂内部,当我写出值时,get作为参考,所以如果你愿意的话,整个get都会进行设置。

这意味着我的原始C ++示例是正确的,但更准确的是(通过Rotem)    的std ::矢量&安培; GetAvg(){return Values [0]; } 所以写作就像这样: GetAvg()[0] = ...;

感谢Oliver和Rotem努力理解我的答案。我觉得这是一个很好的支持社区。那些把我的问题误解为可见性问题的人虽然贬低了这个: - )