迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 >

在 C# 中按引用传递对象

作者:迹忆客 最近更新:2024/02/01 浏览次数:

本教程将讨论在 C# 中将对象传递给函数的方法。


通过值将变量传递给 C# 中的函数

默认情况下,在 C# 中,所有值类型变量都是按值传递。假设我们按值将变量传递给函数,然后在函数中修改该变量。在这种情况下,对函数参数中传递的变量的值没有影响。此处发生的是在内存中创建了所传递变量的单独副本,并且所有操作都在该特定副本上执行。以下代码示例向我们展示了如何在 C# 中按值传递值类型变量。

using System;

namespace pass_object_by_reference {
  class Program {
    static void method1(string value) {
      value = "something";
      Console.WriteLine("New value = {0}", value);
    }

    static void Main(string[] args) {
      string valueType = "Nothing";
      method1(valueType);
      Console.WriteLine("Original Value = {0}", valueType);
    }
  }
}

输出:

New value = something
Original Value = Nothing

在上面的代码中,我们按值将字符串变量 valueType 传递给了 method1() 函数,该函数为传递的变量分配了一个新值。当我们按值将 valueType 变量传递给 method1() 函数时,会在内存中创建具有相同值的变量的两个不同副本。然后,将变量的第二个副本修改为某物值。该第二个副本只能在 method1() 函数内部访问。对第二个值的任何更改都不会更改原始变量 valueType


通过引用将变量传递给 C# 中的函数

我们还可以在 C# 中使用 ref 关键字通过引用传递值类型变量。ref 关键字指定将值通过引用传递到函数。通过这种方法,内存中将仅存在变量的一个副本,并且会将单独的指针传递给指向变量值的函数。以下代码示例向我们展示了如何使用 C# 中的 ref 关键字通过引用传递值类型变量。

using System;

namespace pass_object_by_reference {
  class Program {
    static void method1(ref string value) {
      value = "something";
      Console.WriteLine("New value = {0}", value);
    }

    static void Main(string[] args) {
      string valueType = "Nothing";
      method1(ref valueType);
      Console.WriteLine("Original Value = {0}", valueType);
    }
  }
}

输出:

New value = something
Original Value = something

在上面的代码中,我们使用 C# 中的 ref 关键字通过对 method1() 函数的引用来传递值类型变量 valueTypemethod1() 函数将对 valueType 变量的引用作为参数,并将 valueType 变量的值修改为 something。这次,原始值被修改。


通过引用将对象传递给 C# 中的函数

默认情况下,所有引用类型变量(例如类实例,结构实例等)都通过引用传递到 C# 中的函数。这里发生的事情是原始对象永远不会作为参数传递给函数。对对象的新引用通过值作为函数的参数传递。因此,我们最终有两个指向相同内存位置的指针副本。如果我们修改该指针的值,原始对象的值也会被修改。以下代码示例向我们展示了如何通过引用 C# 中的函数来传递对象。

using System;

namespace pass_object_by_reference {
  public class Sample {
    public string s { get; set; }
  }
  class Program {
    static void dosomething(Sample obj) {
      obj.s = "something";
    }
    static void Main(string[] args) {
      Sample sam = new Sample();
      sam.s = "Nothing";
      dosomething(sam);
      Console.WriteLine(sam.s);
    }
  }
}

输出:

something

在上面的代码中,我们通过引用 dosomething() 函数传递了对象 sam,该函数修改了 sam 对象内部的 s 属性。它将更改原始 sam 对象的值,并将 something 分配给 sam.s 属性。尽管这是通过引用传递对象的默认方法,但是这种方法有一个例外。如果我们使用 new 关键字和类构造函数初始化传递的对象,则会在内存中创建该对象的单独副本。该对象的值的任何更改都不会更改作为参数传递的原始对象。下面的代码示例演示一种方案,其中该对象按值传递给 C# 中的函数。

using System;

namespace pass_object_by_reference {
  public class Sample {
    public string s { get; set; }
  }
  class Program {
    static void dosomething(Sample obj) {
      Console.WriteLine("Initial passed value = {0}", obj.s);
      obj = new Sample();
      obj.s = "something";
      Console.WriteLine("New value = {0}", obj.s);
    }
    static void Main(string[] args) {
      Sample sam = new Sample();
      sam.s = "Nothing";
      dosomething(sam);
      Console.WriteLine("Original Value = {0}", sam.s);
    }
  }
}

输出:

Initial passed value = Nothing
New value = something
Original Value = Nothing

在上面的代码中,我们按值将对象 sam 传递给了 C# 中的 dosomething() 函数。dosomething() 函数接受参数,打印其初始值,修改值,并打印修改后的值。该新值分配给新的存储位置,原始对象 sam 无法访问。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 C# 中发出 HTTP POST Web 请求

发布时间:2024/02/04 浏览次数:131 分类:编程语言

在 C# 中,可以使用 3 种主要方法来发出 HTTP POST Web 请求:WebClient 类,HttpWebRequest 类和 HttpClient 类。本教程将讨论在 C# 中发出 HTTP POST Web 请求的方法。使用 C# 中的 WebClient 类发出 HTTP POST Web 请求

在 C# 中调整图像大小

发布时间:2024/02/04 浏览次数:203 分类:编程语言

有两种主要方法可用于在 C# 中调整图像的大小,Bitmap 类构造函数和 graphics.DrawImage()函数。在本教程中,我们将讨论在C#中调整图像大小的方法。我们将带您完成整个过程,从加载原始图像到保

在 C# 中下载图片

发布时间:2024/02/04 浏览次数:138 分类:编程语言

有 3 种主要方法可用于下载 C# 中的图片,WebClient.DownloadFile()函数,Bitmap 类和 Image.FromStream()函数。在 C# 中使用 WebClient 类下载图片 WebClient 类提供了用于向 C# 中的 URL 发送数据和从 URL 接收数据

在 C# 中使用秒表

发布时间:2024/02/04 浏览次数:139 分类:编程语言

我们可以使用 Stopwatch 类来计算 C# 中的经过时间。使用 C# 中的秒表类计算经过时间 Stopwatch 类在 C# 中准确测量经过的时间。

在 C# 中获取可执行路径

发布时间:2024/02/04 浏览次数:200 分类:编程语言

有 3 种主要方法可用于获取 C# 中程序的可执行路径,即 Assembly 类,AppDomain 类和 Path 类。本教程将介绍获取 C# 代码的可执行路径的方法。使用 C# 中的 Assembly 类获取可执行路径

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便