首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >传递引用类型

传递引用类型
EN

Stack Overflow用户
提问于 2020-10-16 17:24:24
回答 3查看 213关注 0票数 1

我知道当我们按值将引用类型传递给方法时,传递引用的副本,如果您在引用类型内更改一个值,这也会改变方法之外的值,那么当我们在C#中通过引用传递引用类型时?因为看起来是一样的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-10-16 17:36:32

这一点应该很清楚,因为string是引用类型。

代码语言:javascript
复制
public class Program
{
    public static void Main()
    {
        string s1 = "old value a";
        string s2 = "old value b";
        
        Method1(ref s1, s2);
        
        Console.WriteLine(s1); // <-- this is what `ref` can do
        Console.WriteLine(s2);
    }
    
    public static void Method1(ref string a, string b)
    {
         a = "new value a";
         b = "new value b"; 
    }
    
    
}

输出

新值a

旧值b

票数 3
EN

Stack Overflow用户

发布于 2021-05-02 11:58:15

当通过将变量传递给方法时,实际上是将该变量的值的复制传递给该方法。由于引用类型的值是该类型所引用的引用,所以当您通过将引用类型变量传递给方法时,您将此引用的副本传递给该方法,因此,如果您在方法中更改变量的值,这也将更改该方法之外的值。

当将新实例赋值给引用类型的变量时,实际上是说变量引用新引用,因为您只是传递值的副本,而不是引用类型的引用,所以不能将新实例赋值给方法内的变量,但通过ref传递引用类型时,将传递引用类型的引用,因此可以将新实例分配给方法中的变量。

票数 4
EN

Stack Overflow用户

发布于 2020-10-17 05:08:32

另一种情况,而不是字符串

代码语言:javascript
复制
public class Person
{
    public string Name
    {
        get;
        set;
    }
}

假设我们有一个创建Person的方法

版本-1

代码语言:javascript
复制
public static void CreatePerson(Person p, string name)
{
    p = new Person(){ Name = name};
}

版本-2

代码语言:javascript
复制
public static void CreatePersonV2(ref Person p, string name)
{
    p = new Person(){ Name = name };
}

抛出对象引用异常,因为john仍然引用空。

代码语言:javascript
复制
    Person john = null;
    CreatePerson(john, "John");
    Console.WriteLine(john.Name);

,但这会起作用的,因为我们通过了大卫参考

代码语言:javascript
复制
    Person david = null;
    CreatePersonV2(ref david, "David");
    Console.WriteLine(david.Name);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64393735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档