2011-05-25 200 views
4

有没有办法将参数传递给setter? 我如何将一个字符串传递给setter? 我如何使用新字符串param调用setter?有没有办法将参数传递给setter

public string It 
{ 
    get{ { return it;} 

    set { it = value;} 
} 

非常感谢您

回答

4

您可以将它一样可以赋值给变量:

It = "My String"; 

属性getter/setter方法是string get_It()void set_It(string value)

只是语法糖
10

根据您分配给属性的值,setter获取value作为其自己的“参数”:

foo.It = "xyz"; // Within the setter, the "value" variable will be "xyz" 

如果你想使用一个额外的参数,你需要一个索引

public string this[string key] 
{ 
    get { /* Use key here */ } 

    set { /* Use key and value here */ } 
} 

那么你访问它

foo["key"] = "newValue"; 

你不能给索引C#中的名称,或者按名称使用其他语言的命名索引器(C#4以外的COM除外)。编辑:正如Colin所指出的那样,您应该仔细使用索引器......不要仅仅将它们用作获取额外参数的一种方法,例如,在setter中,然后忽略getter中的参数。这样的事情将是可怕的:

// Bad code! Do not use! 
private string fullName; 
public string this[string firstName] 
{ 
    get { return fullName; } 
    set { fullName = firstName + " " + value; } 
} 

// Sample usage... 
foo["Jon"] = "Skeet"; 
string name = foo["Bar"]; // name is now "Jon Skeet" 
+1

只是为了补充一点。除非你正在设置的东西有某种可索引语义,否则不要使用索引器,因为任何维护代码的人都会怀疑地球究竟会发生什么。 – 2011-05-25 12:35:44

+0

不应该是返回fullName;在getter而不是返回firstName;因为它返回“Jon Skeet”,当前的代码肯定会返回“Bar”? – 2011-05-26 09:20:32

+0

@John:是的,就是这个意图。卫生署!固定。 – 2011-05-26 09:22:49

0

一般来说,对于任何财产,直接就可以赋值即It = "";

1

这就是C#性能的基础知识:

Properties (C# Programming Guide)

假设你创建了一个具有该属性的对象等值线:

Blah blah = new Blah(); 
blah.It = "Hello World"; 
String hey = blah.It; 

属性的想法是用一些更多的逻辑(和一些隐藏)来调用局部变量。所以语法类似于使用本地类变量

2

属性在C#中不允许参数。

如果你真的需要,以SE It aditional的信息正确,则推荐的解决方案是实现二传手的方法:

public void SetIt(string value, string moreInfo) {...} 
0

恭维别人都在这个年龄线程说...

也许更好的方法是定义一个struct来保存想要传递的额外信息,然后以这种方式传递数据。例如:

struct PersonName { 

    public string Forename { get; set; } 
    public string Surname { get; set; } 

    public PersonName(string fn, string sn) { 
     Forename = fn; 
     Surname = sn; 
    } 

} 

class MyPerson { 

    public string Forename { get; set; } 
    public string Surname { get; set; } 
    public DateTime dob { get; set; } 

    ... 

    public PersonName Fullname { 
     get { return Forename + " " + Surname; } 
     set { 
      Forename = value.Forename; 
      Surname = value.Surname; 
     } 
    } 
} 

... 

    public void main() { 
     MyPerson aPerson = new MyPerson; 
     aPerson.Fullname = new PersonName("Fred", "Bloggs"); 
    } 

虽然我个人认为这对于如此轻微的事情来说是过度的。此外,它然后乞讨的问题 - 为什么不Forename,Surname对已被定义为适当的structPersonName)?

相关问题