在 C# 中按引用传递对象
本教程将讨论在 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()
函数的引用来传递值类型变量 valueType
。method1()
函数将对 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
无法访问。
相关文章
Linux 上的开发配置 C#
发布时间:2024/02/02 浏览次数:192 分类:编程语言
-
本文介绍如何设置 C# 语言以在 Linux 上进行开发。如果你对在 Linux 中开发 C# 应用程序的方法感兴趣,这篇文章是专门为你准备的。
C# 中的构造函数链
发布时间:2024/02/02 浏览次数:125 分类:编程语言
-
本教程演示如何使用标准语法在 C# 中进行构造函数链接本教程将演示如何在 C# 中进行构造函数链接。要了解构造函数链,首先必须了解以下概念。
C# 中的百分比计算
发布时间:2024/02/02 浏览次数:123 分类:编程语言
-
我们将在本文中学习如何在 C# 中计算百分比。本文将演示如何在 C# 编程语言中计算百分比。创建一个使用 C# 计算百分比的程序
C# 中的 Telnet 库
发布时间:2024/02/02 浏览次数:133 分类:编程语言
-
本教程介绍 Telnet 库并演示 C# 中的简单 Telnet 界面。本教程将解释 Telnet 库并用 C# 演示一个简单的 Telnet 接口。C# 中的 Telnet 库
C# 中的 Graph 库
发布时间:2024/02/02 浏览次数:172 分类:编程语言
-
在本文中,我们将了解什么是图、QuickGraph 库,以及 C# 中使用的工具。假设你有一个项目,你现在必须处理活动依赖关系的网络表示;在这个项目上工作的最佳方式是什么?答案是图。
C# 中具有多个条件的 if 语句
发布时间:2024/02/02 浏览次数:99 分类:编程语言
-
在本教程中,学习 C# 中的运算符以及在 C# 中使用带有多个条件的 if 语句返回相同语句的不同方法。
C# 中的 goto 语句
发布时间:2024/02/02 浏览次数:136 分类:编程语言
-
本教程演示了如何在 C# 中使用 goto 以及何时使用它会有所帮助本教程将演示如何在 C# 中使用 goto 语法,并提供一些代码中的实际使用示例。
C# 中的 App.Config
发布时间:2024/02/02 浏览次数:143 分类:编程语言
-
本教程解释了 C# 中的 App.Config 是什么以及如何使用它 本教程将解释 C# 项目中的 App.Config 文件并演示如何使用它。
在 C# 中声明全局变量
发布时间:2024/02/02 浏览次数:126 分类:编程语言
-
遗憾的是,没有内置方法可以在 C# 中声明一个真正的全局变量。为了实现这一目标,我们必须依靠一些用户定义的方法。通过在 C# 的公共类中定义 public static 变量来声明全局变量