Car*_*ven 16 c# pass-by-reference
在C#中,我知道默认情况下,传递给函数的任何参数都是通过复制的,即在函数内,有一个参数的本地副本.但是,当一个对象作为参数传递给另一个类时呢?
是否会通过引用或值传递以下方案:
class MyClass {
private Object localObj;
public void SetObject(Object obj) {
localObj = obj;
}
}
void Main() {
Object someTestObj = new Object();
someTestObj.name = "My Name";
MyClass cls = New MyClass();
cls.SetObject(someTesetObj);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,类变量localObj是否someTestObj与Main驱动程序类中创建的副本相同?或者两个变量是否指向不同的对象实例?
new*_*cct 16
"对象"永远不会在C#中传递 - "对象"不是语言中的值.该语言中唯一的类型是基本类型,结构类型等和引用类型.没有"对象类型".
类型Object,MyClass等等是引用类型.它们的值是"引用" - 指向对象的指针.对象只能通过引用来操作 - 当你new对它们进行操作时,你得到一个引用,.操作符对引用进行操作; 因为没有对象类型,所以无法获得其值为"是"的变量.
所有类型(包括引用类型)都可以通过值或引用传递.如果参数具有类似ref或的关键字,则通过引用传递参数out.该SetObject方法的obj参数(这是一个引用类型的)不具有这样的关键字,因此它是由值传递 -该引用值传递.
无论在同一类或另一类的方法中,对象都将通过引用传递.以下是相同示例代码的修改版本,以帮助您理解.该值将更改为"xyz".
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
public class Employee
{
public string Name { get; set; }
}
public class MyClass
{
public Employee EmpObj;
public void SetObject(Employee obj)
{
EmpObj = obj;
}
}
public class Program
{
static void Main(string[] args)
{
Employee someTestObj = new Employee();
someTestObj.Name = "ABC";
MyClass cls = new MyClass();
cls.SetObject(someTestObj);
Console.WriteLine("Changing Emp Name To xyz");
someTestObj.Name = "xyz";
Console.WriteLine("Accessing Assigned Emp Name");
Console.WriteLine(cls.EmpObj.Name);
Console.ReadLine();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我发现其他示例不清楚,因此我进行了自己的测试,确认类实例是通过引用传递的,因此对类执行的此类操作将影响源实例。
换句话说,我的 Increment 方法每次调用时都会修改其参数 myClass。
class Program
{
static void Main(string[] args)
{
MyClass myClass = new MyClass();
Console.WriteLine(myClass.Value); // Displays 1
Increment(myClass);
Console.WriteLine(myClass.Value); // Displays 2
Increment(myClass);
Console.WriteLine(myClass.Value); // Displays 3
Increment(myClass);
Console.WriteLine(myClass.Value); // Displays 4
Console.WriteLine("Hit Enter to exit.");
Console.ReadLine();
}
public static void Increment(MyClass myClassRef)
{
myClassRef.Value++;
}
}
public class MyClass
{
public int Value {get;set;}
public MyClass()
{
Value = 1;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
109282 次 |
| 最近记录: |