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

  • 本文关键字:设置 只读属性 属性 机制 c#
  • 更新时间 :
  • 英文 :


首先,我对C#不是很熟悉,但我对C++很熟悉。我没有找到任何有关此的信息。当 C# 属性仅实现 get 并且该集处于隐藏状态时,通过什么机制设置该属性。它是在循环中连续设置的只读属性。

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

(我遇到了一个我试图理解的代码)

例如:

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

(Series 只是一个双精度数组,但从数组的末尾按索引访问它们)

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写入值,或者集合是自动实现的,所以写入和读取上述属性是访问完全不同的索引甚至变量?

上述 C# 示例甚至是有效的 C# 代码吗?

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

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

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

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

可以将 C# 属性与一组C++方法进行比较。 get是C++类中的getProperty()方法,集合是setProperty(value)。 C# 属性实际上与具有一个字段和两个方法没有太大区别。整个获取和设置只是让编译器为您生成此内容的好方法。

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

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] = ...;

谢谢奥利弗和罗特姆努力理解我的答案。我觉得这是一个很好的和支持社区。那些将我的问题误解为可见性问题的人正在对此投反对票:-)

最新更新