[英]How to set the value of a read-only property with generic getters and setters?
[英]How is a property without a set allowed (read-only property) is being set inside the class? What mechanism?
首先,我不太熟悉 C#,但我熟悉 C++。 我没有找到任何有关此的信息。 通过什么机制设置 C# 属性,当它只实现了一个 get 并且该设置被隐藏时。 它是一个只读属性,在循环内连续设置。
我的预感是 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# 代码吗?
这意味着您只能读取属性的值,而不能从外部写入它。
以文件类为例。 它会有一个属性 FileSize ,你可以从外面读取它。 拥有 Setter 是没有意义的,因为设置文件大小应该是不可能的(您必须修改文件的内容才能更改文件大小)。
然后,您将采用以下形式实现只读属性:
public long FileSize { get { return Content.Length; } }
您可以将 C# 属性与一组 C++ 方法进行比较。 get 将是 C++ 类中的 getProperty() 方法,而 set 将是 setProperty(value)。 AC# 属性实际上与具有一个字段和两个方法没有太大区别。 整个 get 和 set 只是让编译器为您生成它的好方法。
这意味着这是一个您希望从对象外部读取它而不修改它的属性,例如您可以这样做:
public class MyObject
{
private string _currentState;//This will be changed only from inside class
public string MyCurrentState
{
get
{
return _currentState;
}
}
}
既然你对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;
您可以设置没有设置的属性。 这仅意味着您无法从课程外部访问它(可见性)。 在类内部,get 在我写入值时充当参考,因此如果您愿意,可以在整个 get 过程中进行设置。
这意味着我原来的 C++ 示例是正确的,但更准确的是(由 Rotem) std::vector& GetAvg() { return Values[0]; 所以写作是这样发生的:GetAvg()[0] = ...;
感谢 Oliver 和 Rotem 努力理解我的答案。 我觉得这是一个很好的支持社区。 那些将我的问题误解为可见性问题的人对此不以为然:-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.