[英]Is there a way to pass an argument to a setter
有沒有辦法將參數傳遞給 setter? 我如何將字符串傳遞給下面的設置器? 我將如何使用新的字符串參數調用 setter?
public string It
{
get{ { return it;}
set { it = value;}
}
非常感謝
根據您分配給屬性的值,setter 將value
作為自己的“參數”:
foo.It = "xyz"; // Within the setter, the "value" variable will be "xyz"
如果你想使用額外的參數,你需要一個indexer :
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"
你可以像給變量賦值一樣賦值:
It = "My String";
屬性 getter/setter 只是string get_It()
和void set_It(string value)
的語法糖
屬性不允許 C# 中的 arguments。
如果您確實需要其他信息才能正確設置It
,那么推薦的解決方案是將 setter 實現為一種方法:
public void SetIt(string value, string moreInfo) {...}
為了贊美其他人在這個古老的線程中所說的話......
也許更好的方法是定義一個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
對定義為適當的struct
( PersonName
)?
通常,我們可以直接為任何屬性賦值,即It = "";
這是 C# 屬性的基礎知識:
假設您創建了一個具有該屬性的 object blah:
Blah blah = new Blah();
blah.It = "Hello World";
String hey = blah.It;
屬性的想法是用更多的邏輯(和一些隱藏)包裝對局部變量的調用。 所以語法類似於使用本地 class 變量
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.