Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过;修饰语;函数返回的字符串? 类测试 { 公共字符串get(){return s;} 私有字符串s=“World”; } 类修饰语 { 公共静态无效修改(参考字符串v) { v+=“_测试”; } } 字符串s1=“地球”; 修改器。修改(参考s1)_C#_String_Ref - Fatal编程技术网

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()
a
test
对象:

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()
a
test
对象:

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()方法。@您不能更改字符串。字符串是不可变的