[英]How to pass in the “modifier” string returned by the function?
class test
{
public String get() {return s;}
private String s="World";
}
class modifier
{
public static void modify(ref String v)
{
v+="_test";
}
}
String s1="Earth";
modifier.modify(ref s1); <-------- OK
test c=new test();
modifier.modify(ref c.get()); <------- Error
如何傳遞函數返回的“修飾符”字符串? 通過另一個String對象進行的分配是不可接受的。 那么如何創建副本。
您正在嘗試用C#編寫C ++代碼。 您將需要使用C#方式進行處理。 為test.s添加一個屬性,而不是一個名為“ get()”的方法。 我們將在以下代碼中將此新屬性稱為“ MyString”:
class test
{
public String MyString
{
get
{
return s;
}
set
{
s = value;
}
}
private String s = "World";
}
class modifier
{
public static string modify(String v)
{
return v + "_test";
}
}
test c = new test();
c.MyString = modifier.modify(c.MyString);
如果您不喜歡Matthew Watson的答案並且想要堅持使用自己的方法,則可以使用StringBuilder,這是一個可以更改其值而無需創建新值的String!
我的意思是:
普通字符串的值無法更改,正在發生的事情是正在創建一個新的字符串。...並且指針(指向要更改其值的字符串)從現在指向該新字符串。 “正在指向”舊字符串的所有其他指針.....仍然指向舊字符串!(字符串的值沒有改變!)
我不確定這是否足夠清楚,但是如果您想使用Strings,則必須了解這一點。這正是s1無法更改其值的原因。
解決方法是使用StringBuilder:
class test
{
public StringBuilder get() { return s; }
private StringBuilder s = new StringBuilder("World");
}
class modifier
{
public static void modify(StringBuilder v)
{
v.Append("_test");
}
}
和一些測試代碼:(當然,所有這些都伴隨着處理成本……但是我不認為現在會成為問題)
StringBuilder s1 = new StringBuilder("Earth");
System.Diagnostics.Debug.WriteLine("earth is {0}", s1);
modifier.modify(s1); //<-------- OK
System.Diagnostics.Debug.WriteLine("earth is {0}",s1);
test c=new test();
StringBuilder aa=c.get();
System.Diagnostics.Debug.WriteLine("earth is {0}", aa);
modifier.modify(aa); //<------- Error(not anymore)
System.Diagnostics.Debug.WriteLine("earth is {0}", c.get());
在使用代碼之前,請先了解String和StringBuilder的工作原理
您必須創建一個臨時變量:
string tmp = c.get();
modifier.modify(ref tmp);
因為您要通過引用傳遞參數。
類test
的設計使其不能從類外部重新分配其字段s
(更改為指向新對象)。 這是因為s
是private
,而get()
方法僅返回 s
,因此無法重新分配它。
要么改變類的test
,讓外界重新分配s
不知何故,或使用反射來訪問private
從外場。
您可以將屬性與get / set-cesser一起使用 ,然后將test
對象傳遞給Modify modify()
:
class test
{
public String myString
{
get { return s; }
set { s = value; }
}
private String s="World";
}
class modifier
{
public static void modify(test myTest)
{
myTest.myString += "_test";
}
}
test c = new test();
modifier.modify(c);
Console.WriteLine(c.myString); //World_test
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.