首先,我并不熟悉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#代码?
答案 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努力理解我的答案。我觉得这是一个很好的支持社区。那些把我的问题误解为可见性问题的人虽然贬低了这个: - )