有没有办法将参数传递给setter

时间:2011-05-25 12:31:05

标签: c#

有没有办法将参数传递给setter? 我如何将字符串传递给下面的setter? 如何使用新的字符串参数调用setter?

public string It
{
   get{ { return it;}

   set { it = value;}
}

非常感谢

6 个答案:

答案 0 :(得分: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#中提供索引器名称,也不能按名称使用其他语言的命名索引器(COM的情况除外,从C#4开始)。

编辑:正如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 :(得分:4)

您可以像为变量赋值一样分配它:

It = "My String";

属性getter / setter只是string get_It()void set_It(string value)的语法糖

答案 2 :(得分:2)

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

如果您确实需要aditional信息以便正确地It,那么建议的解决方案是将setter实现为方法:

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

答案 3 :(得分:1)

这是C#属性的基础:

<强> Properties (C# Programming Guide)

让我们假设您创建了一个具有该属性的对象:

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

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

答案 4 :(得分:0)

通常,对于任何属性,我们都可以分配值,即It = "";

答案 5 :(得分: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");
    }

但就个人而言,我认为这对于如此轻微的事情来说太过分了。此外,它然后乞求问题 - 为什么ForenameSurname对已经被定义为适当的structPersonName)?