C#中字符串的行为

Sat*_*bir 2 c#

我是一名C++程序员,现在正在开发一个C#项目.

我试图在下面的片段中理解为什么即使函数正在改变它的值,字符串的值也不会改变,我认为它是一个对象并将作为参考传递.

public class TestClass
    {
        public TestClass(String passedStr)
        {
            passedStr = "Change me";
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            String aString="I am what i am";
            TestClass obj = new TestClass(aString);
            Console.WriteLine(aString);

        }
    }
Run Code Online (Sandbox Code Playgroud)

但是用户定义的类的行为是不同的.

 public class TestClass
    {
        private int x;
        public int ID
        {
            get
            {
                return x;
            }
            set
            {
                x = value;
            }
        }
        public TestClass(int a)
        {
            x = a;
        }
    }
    public class Tester
    {
        public Tester(TestClass obj)
        {
            obj.ID = 999;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {

            TestClass obj = new TestClass(555);
            Tester tester = new Tester(obj);
            Console.WriteLine(obj.ID);
        }
    }
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 6

让我们回到基础.

变量是存储位置.

string类型的变量是存储null或对字符串的引用的存储位置.

"passStr"和"aString"是不同的变量.

当您调用"new TestClass(aString)"时,为"passStr"创建一个新的存储位置,并将"aString"的内容复制到其中.您现在有两个具有相同内容的变量:对字符串的引用.

在构造函数内部,您可以更改存储在"passedStr"存储位置中的值."aString"保持不变.

C#中的"ref"和"out"关键字表示"使形式参数和彼此的参数别名 ".在这种情况下,您只有一个具有两个不同名称的变量.当你改变其中一个时,另一个也会改变,因为它们是同一个变量.


Meh*_*dad 5

不,它是按价值传递的; 没有ref关键字.

通过值(无关键字)传递引用类型(此处为类),就像在C++中传递指针的副本一样.您正在重新分配指针,而不是实际数据(无论如何您都无法使用字符串).ref

如果您需要传递引用,请尝试:

    public TestClass(ref String passedStr)
    {
        passedStr = "Change me";
    }

    ...
    TestClass obj = new TestClass(ref aString);
Run Code Online (Sandbox Code Playgroud)