2011-05-22 57 views
16

我想我以前见过某处,但现在我不记得都没有找到它,是否有办法使用参数生成getter属性?带有参数的Getter属性

我的意思是,我可以将“float getSize();” “浮动大小”

float getSize() { 
    return this.size; 
} 

float Size { 
    get { return this.size; } 
} 

然后,我可以转换为例如, “漂浮的getSize(字符串单元);”到“浮动大小(字符串单位)”或类似的东西?

float getSize(String unit) { 
    return this.size; 
} 

float Size(String unit) { 
    get { 
     if (unit == Unit.Meters) 
      return this.size/100; 
     else 
      return this.size; 
    } 
} 

我觉得有使用功能都没有真正的问题,但可能会更好看这种方式:P

+7

如果getters有参数,它们看起来不像方法调用吗? – BoltClock 2011-05-22 14:49:18

+3

@BoltClock:是的,我想。无论如何,它们都是作为方法调用实现的。而VB.NET *不允许getter使用任意参数来定义。 – 2011-05-22 15:40:08

回答

24

要回答这个问题:不,这是不可能的,因为已经指出,一个带参数的getter看起来就像一个方法。

你正在考虑的事情可能是一个索引默认属性,它看起来像这样:

class Test 
{ 
    public string this[int index] 
    { 
     get { return index.ToString(); } 
    } 
} 

这使您可以索引测试的实例,就像这样:

Test t = new Test(); 
string value = t[1]; 
+0

谢谢,我担心这是不可能的。但正如名称所说,我尝试保留属性以获取与对象相关的“属性”或参数,以及操纵和计算其他内容的方法。由于没有其他选择,我必须使用以下方法:D – Dane411 2011-05-22 15:32:25

+3

@ Dane411:实际上建议除了简单地返回私有字段的值(例如从文件中读取数据)之外,执行代价高昂的操作的getter,或那些需要采取参数的方法,按照常规方法来实施。将它们命名为GetXXX(),每个人都会理解你的代码。 – 2011-05-22 15:37:49

+0

谢谢科迪,那是我做的。但它并不昂贵,但从一个数组中获得了一个项目......所以我对此稍微多了一点,正如driis所说的,我用一个带有索引属性的内部类实现了一个方法(尽管方法更便宜在资源):) – Dane411 2011-05-22 16:53:57

13

但只是好奇... 具有属性的参数是可能的在VB。净

看起来像如下:

Public ReadOnly Property oPair(param As String) As Result 
    Get 
     'some code depends on param 
    End Get 
    End Property 

它不会比普通功能更好,但有时候很高兴有这种可能性。

0

这是可能的类对象合理高效地有一些由具有属性的作用名为索引属性的getter返回一个struct它只是拥有私人参考类对象,包括索引属性吸气剂链到班上的一种方法。这样的单项结构可以基本上免费地生成(它可能适合寄存器,并且将被加载到另一个寄存器中的值; JIT甚至能够识别出可以使用相同的寄存器这两个目的),所以如果使用这样的getter使代码更具可读性,这是一个有利的实质性论据。

不幸的是,struct成员无法指示它们是否修改了底层结构,因此无法对索引属性设置器使用相同的方法。尽管这将有助于它一个人可能有一个OrderedCollection<T>的东西,如:

struct ByIndexAccessor { 
    OrderedCollection<T> owner; 
    ByIndexAccessor(OrderedCollection<T> 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实现可安全使用的方式在只读结构上。