有没有一种方法可以将参数传递给setter函数?

8

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

public string It
{
   get{ { return it;}

   set { it = value;}
}

非常感谢您。
6个回答

11

设置器(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所指出的那样,您应该小心使用索引器...不要仅将它们用作获取额外参数的方法,然后在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"

2
只是补充一下。除非你设置的东西具有可索引的语义,否则不要使用索引器,因为那么维护代码的任何人都会想知道到底发生了什么。 - Colin Mackay
在getter中应该返回fullName而不是firstName才能返回“Jon Skeet”,当前的代码肯定会返回“Bar”,不是吗? - John Pappin
@John:是的,那是我们的意图。哎呀!已经修复了。 - Jon Skeet

4

C#中属性不支持参数。

如果你需要额外的信息来正确使用 ,推荐的解决方案是将setter实现为一个方法:

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

4
你可以像给变量赋值一样来分配它:
It = "My String";

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


0

通常,我们可以直接为任何属性分配值,例如:It = "";


0
为了补充这个老旧的帖子中其他人所说的...
也许更好的方法是定义一个结构体来保存你想要传递的额外信息,然后通过这种方式传递数据。例如:
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");
    }

个人而言,我认为这对于如此微小的事情来说有些过度了。此外,这也引出了一个问题 - 为什么名字姓氏这一对不已经定义为适当的structPersonName)了呢?


-1

这是C#属性的基础:

C#编程指南中的属性

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

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

属性的概念是用一些逻辑(和一些隐藏)来包装对本地变量的调用。因此,语法类似于使用本地类变量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接