如何在类内设置不允许设置的属性(只读属性)?什么机制? 首先,我对C语言并不太熟悉,但我是C++的。我没有找到任何关于这个的信息。当C#属性只有一个get实现且该集被隐藏时,通过什么机制设置它。它是在循环内连续设置的只读属性
我的直觉是get返回一个引用,在本例中,C#使用该引用设置值。对吗 (我遇到了一个我正在努力理解的代码) 例如:如何在类内设置不允许设置的属性(只读属性)?什么机制? 首先,我对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
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]=谢谢你,奥利弗。这意味着,我的C++例子是准确的,对吗?我觉得RoTEM和奥利弗的答案是不同的。我是在写原始数组还是“假装”数组?(新定义的,当代码超出范围时将保留)指示器将无法以这种方式建立其值。示例代码位于for循环中。奥利弗的回答现在对我来说更有意义了。@Thomas:不完全是,double&是对double值的引用,而Series似乎类似于封装的double数组。将double替换为double*,这样就更相似了。但实际上比较C和C++是困难的,因为在C++中,你必须明确地引用指针,而在C++中,它是含蓄地说的。你甚至没有解释c#发生了什么code@Camilo特列文托:有什么问题吗?我的目标是帮助OP。他来自C++,我会用他熟悉的语言来解释他。关于c部分,他可以参考其他答案。@Camilo对此表示抱歉。当AVG(0)被设置时,它通过引用来写值[1 ]。问题是OP是学习C,而不是C++。这并不能解释为什么在c#中可以有只读属性,也不能解释它们为什么有用,以及它们是如何工作的。我的问题是关于编写时会发生什么。可见性是另一个话题。实际上,它甚至不是只读属性(在英语意义上),因为您可以在同一个类中编写它。没有集合的属性是只读属性。只能在构造函数中赋值。如果你想在以后修改它,你需要有一个私有集代码>。这不是关于谁可以分配它,而是关于使它成为只读的。正如我已经说过的,您不是在更改(readonly)属性,而是要更改已分配的对象
UserOfSeries* aUserOfSeries = getUserOfSeriesFromTheSystem();
Series<double>& theAvg = aUserOfSeries->Avg();
theAvg[4] = 12000.000;