繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM