0
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 对象进行赋值是不可接受的。那么副本将如何创建。

4

5 回答 5

2

您正在尝试用 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);
于 2013-01-28T14:30:09.877 回答
1

如果您不喜欢 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 的工作原理

于 2013-01-28T14:51:54.490 回答
0

您必须创建一个临时变量:

string tmp = c.get();
modifier.modify(ref tmp);

因为您通过引用传递参数。

于 2013-01-28T14:17:33.623 回答
0

该类test的设计使其字段s不能从类外部重新分配(更改为指向新对象)。那是因为sis private,并且该get()方法只返回 s,因此不能重新分配它。

要么更改类test以允许外部世界以s某种方式重新分配,要么使用反射从外部访问private字段。

于 2013-01-28T14:29:14.163 回答
0

您可以将属性与get/set-eccessor 一起使用,然后传递给modify()atest对象:

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
于 2013-01-28T14:49:43.910 回答