Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在类内设置不允许设置的属性(只读属性)?什么机制? 首先,我对C语言并不太熟悉,但我是C++的。我没有找到任何关于这个的信息。当C#属性只有一个get实现且该集被隐藏时,通过什么机制设置它。它是在循环内连续设置的只读属性_C# - Fatal编程技术网

如何在类内设置不允许设置的属性(只读属性)?什么机制? 首先,我对C语言并不太熟悉,但我是C++的。我没有找到任何关于这个的信息。当C#属性只有一个get实现且该集被隐藏时,通过什么机制设置它。它是在循环内连续设置的只读属性

如何在类内设置不允许设置的属性(只读属性)?什么机制? 首先,我对C语言并不太熟悉,但我是C++的。我没有找到任何关于这个的信息。当C#属性只有一个get实现且该集被隐藏时,通过什么机制设置它。它是在循环内连续设置的只读属性,c#,C#,我的直觉是get返回一个引用,在本例中,C#使用该引用设置值。对吗 (我遇到了一个我正在努力理解的代码) 例如: public Series<double> Avg { get { return Values[1]; } } public Series<double> Default { get { return Values[0]; } } 那么上面发生了什么?只是为了理解,它有点像下面的C++代码? double& Avg(int inde

我的直觉是get返回一个引用,在本例中,C#使用该引用设置值。对吗

(我遇到了一个我正在努力理解的代码)

例如:

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

public Series<double> Default
{
    get { return Values[0]; }
}
那么上面发生了什么?只是为了理解,它有点像下面的C++代码?
double& Avg(int index)
{
    return Values[index+1];
}
<>当然,在C++中,你将使用<代码> AVG(1)< /C> >代替<代码> AVG [1 ] < /Cord>。因为它是一个函数,我只想知道逻辑在.Rsi.CS中实际所做的事情。在这种情况下,get类似于一个引用,因此它也可以通过get写入值,或者set是自动实现的,因此写入和读取上述属性是访问一个完全不同的索引甚至变量


上面的C#示例是否是有效的C#代码?

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

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

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

public long FileSize { get { return Content.Length; } }
<>你可以将C++属性与C++方法集进行比较。 GET将是C++类中的GETFraseType()方法,而SET属性将是SET属性(value)。
C#属性实际上与拥有一个字段和两个方法没有太大区别。整个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];
    }
}
模板类系列
{
//一些模板类定义
// C++中的索引运算符
T&运算符[](int idx)
{
返回一些私有tarray[idx];
}
}
UserOfSeries类
{
系列值[];//=…某处
公众:
系列和平均值()
{
返回值[1];
}
序列和默认值()
{
返回值[0];
}
}
当你使用它时,你可能会写

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

您可以在不设置属性集的情况下设置属性。这只意味着您无法从类外部访问它(可见性)。在类内部,get在我编写值时充当一个引用,因此如果愿意,设置会在get的整个过程中进行

这意味着我原来的C++例子是正确的,但更准确的是(通过ROTEM) std::vector&GetAvg(){返回值[0];} 所以写作是这样的: GetAvg()[0]=



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

这意味着这是只读属性下一个逻辑问题,上面的代码如何编写只读属性?@Thomas:只有getter的属性通常会引用将在内部写入的私有字段。在您的例子中,这由数组元素值[1]和值[0]表示。oliver,谢谢。您是理解我的问题的人:)虽然正确但可能重复列出使用get only属性的一些原因将是一个很好的补充。您不会写入属性,而是写入属性返回的对象,即Series类型的对象。假设它是两个单独的语句:
Series a=Avg;a[0]=私有集。这不是关于谁可以分配它,而是关于使它成为只读的。正如我已经说过的,您不是在更改(readonly)属性,而是要更改已分配的对象
UserOfSeries* aUserOfSeries = getUserOfSeriesFromTheSystem();
Series<double>& theAvg = aUserOfSeries->Avg();
theAvg[4] = 12000.000;