带参数的Getter属性
我想我以前见过某个地方,但现在我不记得都找不到它,有没有办法用参数制作一个getter属性?
我的意思是,因为我可以转换“float getSize();” 到“浮动大小”
float getSize() { return this.size; } float Size { get { return this.size; } }
然后,我可以转换为例如“float getSize(String unit);” “浮动大小(字符串单位)”或类似的东西?
float getSize(String unit) { return this.size; } float Size(String unit) { get { if (unit == Unit.Meters) return this.size/100; else return this.size; } }
我认为根本没有使用function的问题,但这样看起来可能更好:P
回答这个问题:不,这是不可能的,正如已经指出的那样,带参数的getter看起来就像一个方法。
您正在考虑的事情可能是索引的默认属性,如下所示:
class Test { public string this[int index] { get { return index.ToString(); } } }
这允许您索引到Test的实例,如下所示:
Test t = new Test(); string value = t[1];
但就像好奇心一样……在VB .Net中可以使用带参数的属性
如下所示:
Public ReadOnly Property oPair(param As String) As Result Get 'some code depends on param End Get End Property
它不比常规function更好,但有时候有这种可能性很好。
通过使属性返回一个struct
来简单地保存对类对象的私有引用并包含一个链接到方法的索引属性getter,类对象可以合理有效地具有表现为命名索引属性getter的东西。class级。 这样的单项结构可以基本上免费生成(它可能适合寄存器,并且将加载另一个寄存器中的值; JIT甚至可以识别相同的寄存器可以用于这两个目的),所以如果使用这样的getter使代码更具可读性,这是一个有利的实质性论据。
遗憾的是,struct成员无法指出它们是否修改了底层结构,因此无法对索引属性setter使用相同的方法。 即使它有用也可以有一个OrderedCollection
,例如:
struct ByIndexAccessor { OrderedCollection owner; ByIndexAccessor(OrderedCollection o) { owner = o; } T this[int index] { get { return owner.handleGet(index); } set { owner.handleSet(index, value); } } } ByIndexAccessor ByIndex { get {return new ByIndexAccessor(this); } }
并说myCollection.ByIndex[3] = newThing;
,C#会拒绝这样的代码,因为它无法知道这个特定的索引set
实现可以安全地用在只读结构上。