如何传入函数返回的“修饰符”字符串
本文关键字:修饰符 字符串 何传入 函数 返回 | 更新日期: 2023-09-27 17:56:32
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
如何传入函数返回的"修饰符"字符串?通过另一个字符串对象进行赋值是不可接受的。那么副本将如何创建。
您正在尝试用 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.这是一个可以在不创建新值的情况下更改其值的字符串!
我的意思是:
普通字符串的值无法更改,正在发生的事情是正在创建一个新字符串。指针(指向要更改其值的字符串)从现在开始指向这个新字符串。所有其他指针...."指向"旧字符串.....还在指指点点...到旧字符串!(字符串的值没有改变!
我不确定这是否足够清楚,但如果你想玩 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-eccessor 一起使用,然后将一个 test
对象传递给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