2013-02-22 40 views
2

据我所知ClassObject是引用类型。对象是否真的是引用类型?

我有下面的方法来更改值

public void ChangeValue(MyClass classobj) 
{ 
    classobj.Number = classobj.Number*2; 
} 

我调用该方法的价值

var myClass=new MyClass(); 
int myNumber = 10; 
myClass.Number = myNumber; 
ChangeValue(myClass); 

翻番这将是回到20这是很好的,你可以把它解释为当你创建你的类的对象,然后它传递给方法的引用,它将更新参考值。

但我的问题是为什么它不发生对象类型。换句话说,为什么当我做对象和一些值分配给它象下面

object myObject = new object(); 
string sometext = "Some object value"; 
myObject = sometext; 
ChangeValue(myObject) 

它不会执行方法

public void ChangeValue(object objectValue) 
{ 
    objectValue = null; 
} 

我知道的方法参数后更改的值是值类型,但可以不明白它有两种参考类型的不同行为。

+1

阅读以下内容:http://www.yoda.arachsys.com/csharp/parameters.html方法参数传递的一个很好的解释。 – 2013-02-22 11:37:08

+0

Just rememboer:'object'是一个别名'System.Object',它是一个类,这意味着它是一个引用类型。 – 2013-02-22 11:37:26

+1

另外:http://stackoverflow.com/questions/3272861/reference-and-value-types-scenario http://stackoverflow.com/questions/1658985/what-is-a-value-class-and-what- is-a-reference-class-in-c – 2013-02-22 11:37:39

回答

0

这不是一个不同的行为,你在做不同的事情

这正是作为您object例如:

public void ChangeValue(MyClass classobj) 
    { 
     classobj = null; 
    } 

这将作为你的第一个例子(假设你会把MyClass实例):

public void ChangeValue(object objectValue) 
    { 
     ((MyClass)objectValue).Number *= 2; 
    } 

这里发生了什么是当您分配参数(不属性或字段的参数),你只是改变该参数的值。调用代码中的原始值和变量保持不变。

同样的情况,在这里:

MyClass a = new MyClass(); 
MyClass b = a; 
a = null; 
// b still contains the value created in the first line 

简单的实际价值来说,参考变量保存指针(内存地址)。 通过更改变量的值,可以使其指向不同的对象或null。 但是当你在做a.field=2这意味着你正在拍摄对象a正在引用并更改它的field成员值。

1

您将objectValue通过值传递给ChangeValue(object objectValue),此值为参考值。然后你改变这个值,但不是myObject的值。

您必须将其作为ChangeValue(ref object objectValue)传递给实际传递引用的值。

+0

我对myclass对象做了同样的事情,我创建它的对象,然后将它传递给Changevalue(MyClass objClass),并且此值是引用类型。然后我将它的值更改为20,它也反映了我的调用者对象值。那为什么它是为myClass对象工作的? – wikinevis 2013-02-22 11:49:13

+0

@wikinevis,因为你实际上并没有改变myClass的值(myClass的值是一个引用),所以你改变了myClass引用的对象的值。 – aush 2013-02-22 11:57:36

2

你实际上在这里做了两件不同的事情。 ObjectMyClass确实都是参考类型,这意味着您将对实际对象的引用传递给ChangeValue方法。但是,您在该方法中看到的引用是调用方所持引用的副本。它们指向相同的对象,因此当您在方法中操作对象时,方法的调用者可以看到您的更改,但对方法内实际引用的更改只会影响方法本身。

在试图总结,目的是通过参考通过,但这些参考文献都通过通过。

在你的方法

public void ChangeValue(object objectValue) 
{ 
    objectValue = null; 
} 

你实际上做的是重新分配基准objectValue,而引用称为myObject参考其调用者的副本。因为该方法只有一个副本,所以根本不会影响调用者的参考。

有一种方法可以使这项工作,你必须通过参考传递参考。这总是让我很头疼,但这就是ref关键字的作用。

public void ChangeValue(ref object objectValue) 
{ 
    objectValue = null; // this is the SAME reference as the caller has, so the caller will see this change 
} 

然而然后它也有被称为这种方式:

ChangeValue(ref myObject); 

,以便它在调用点,它可能回来指向不同的对象明显。了解这一点很重要,因为如果引用意外地指向不同的对象,那么您仍然可能仍然依赖于旧值,并最终陷入可怕的混乱状态。

+0

我可以看到你的意思,这确实是对的。我的问题伴随着你的解释是“为什么myClass的值是ChangeValue(MyClass classobj)中的变化?”想象一下myclass引用的副本来到这个方法,我改变了classobj.Number = 0;那么它将如何通知来电者这种改变? – wikinevis 2013-02-22 11:57:46

+0

这不是告诉来电者有关变化的问题。调用者和方法都可以看到和修改相同的对象,因为它们都有对它的引用。如果调用者在方法运行后查看对象,它将看到更改,因为该方法已更改同一对象。 – 2013-02-22 15:31:15

相关问题