簡體   English   中英

如何傳遞函數返回的“修飾符”字符串?

[英]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 (更改為指向新對象)。 這是因為sprivate ,而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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM