C# 如何通过;修饰语;函数返回的字符串? 类测试 { 公共字符串get(){return s;} 私有字符串s=“World”; } 类修饰语 { 公共静态无效修改(参考字符串v) { v+=“_测试”; } } 字符串s1=“地球”; 修改器。修改(参考s1)
您必须创建一个临时变量:C# 如何通过;修饰语;函数返回的字符串? 类测试 { 公共字符串get(){return s;} 私有字符串s=“World”; } 类修饰语 { 公共静态无效修改(参考字符串v) { v+=“_测试”; } } 字符串s1=“地球”; 修改器。修改(参考s1),c#,string,ref,C#,String,Ref,您必须创建一个临时变量: 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
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
因为您是通过引用传递参数。您必须创建一个临时变量:
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
因为您是通过引用传递参数。类
测试
的设计使其字段s
不能从类外部重新分配(更改为指向新对象)。这是因为s
是private
,而get()
方法只返回s
,因此无法重新分配它
更改类
test
以允许外部世界以某种方式重新分配s
,或者使用反射从外部访问私有字段。类test
的设计使其字段s
无法从类外部重新分配(更改为指向新对象)。这是因为s
是private
,而get()
方法只返回s
,因此无法重新分配它
改变类<代码>测试< /> >允许外部世界重新分配<代码> s >代码>,或使用反射从外部访问私下<代码>字段。
< p>您试图在C++中编写C++代码。你需要以C#的方式来处理这个问题。
为test.s添加属性,而不是名为“get()”的方法。
我们将在下面的代码中将此新属性称为“MyString”:
string tmp = c.get();
modifier.modify(ref tmp);
你试图在C++中编写C++代码。你需要以C#的方式来处理这个问题。
为test.s添加属性,而不是名为“get()”的方法。
我们将在下面的代码中将此新属性称为“MyString”:
string tmp = c.get();
modifier.modify(ref tmp);
您可以将属性与get/set eccessor一起使用,然后传递到modify()
atest
对象:
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);
您可以将属性与get/set eccessor一起使用,然后传递到modify()
atest
对象:
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。这是一个可以更改其值而不创建新值的字符串
我的意思是:
普通字符串的值无法更改,正在发生的是正在创建一个新字符串…指针(指向要更改其值的字符串)从此指向此新字符串。所有其他指向旧字符串的指针…仍然指向旧字符串!(字符串的值没有更改!)
我不确定这是否足够清楚,但如果你想玩弦乐,你必须理解这一点。这就是为什么s1不能改变它的值
解决方法是使用StringBuilder:
test c = new test();
modifier.modify(c);
Console.WriteLine(c.myString); //World_test
还有一些测试代码:(当然,所有这些都会带来处理成本……但我认为目前这不是一个问题)
StringBuilder s1=新StringBuilder(“接地”);
System.Diagnostics.Debug.WriteLine(“地球是{0}”,s1);
修饰语。修饰(s1)// 如果您不喜欢Matthew Watson的答案,并且希望坚持自己的方法,那么最好使用StringBuilder。这是一个可以更改其值而不创建新值的字符串
我的意思是:
普通字符串的值无法更改,正在发生的是正在创建一个新字符串…指针(指向要更改其值的字符串)从此指向此新字符串。所有其他指向旧字符串的指针…仍然指向旧字符串!(字符串的值没有更改!)
我不确定这是否足够清楚,但如果你想玩弦乐,你必须理解这一点。这就是为什么s1不能改变它的值
解决方法是使用StringBuilder:
test c = new test();
modifier.modify(c);
Console.WriteLine(c.myString); //World_test
还有一些测试代码:(当然,所有这些都会带来处理成本……但我认为目前这不是一个问题)
StringBuilder s1=新StringBuilder(“接地”);
System.Diagnostics.Debug.WriteLine(“地球是{0}”,s1);
修饰语。修饰(s1)//记住:字符串是不可变的类型。您无法更改它们。public String get(){return s;}private String s=“World”;不确定,但尝试更改这两个put的顺序。private first“ref”允许我将字符串作为参数传递并更改它。没有这样的机制来获取函数结果的字符串吗?publicstaticstringmodify(stringv){returnv+“_test”}只返回新字符串。请注意,当您通过ref传递字符串时,您将通过ref返回一个新字符串(旧字符串将消失)。请记住:字符串是不可变的类型。您无法更改它们。public String get(){return s;}private String s=“World”;不确定,但尝试更改这两个put的顺序。private first“ref”允许我将字符串作为参数传递并更改它。没有这样的机制来获取函数结果的字符串吗?publicstaticstringmodify(stringv){returnv+“_test”}只返回新字符串。请注意,当您通过ref传递字符串时,您将通过ref返回一个新字符串(旧字符串将消失)。我无法创建副本。我需要更改测试类的字符串。然后,向测试类添加一个set()方法。@您不能更改字符串。字符串是不可变的类型。函数的结果不会占用内存中的特定空间,除非它被赋给变量。这是不可能的。@justAnotherUserYou可能知道当人们说“更改字符串”时,他们真正的意思显然是“更改字段(或变量)的引用以引用另一个字符串实例”。我无法创建副本。我需要更改测试类的字符串。然后,向测试类添加一个set()方法。@您不能更改字符串。字符串是不可变的