我知道一些差异,
我错过了还有其他的区别......如果是的话,他们是什么?
a value class
和reference class
C#的定义是什么?
这与a value type
和reference type
?有什么不同?
我问这个问题是因为我在MCTS Self-Paced Training Kit(考试70-536)中读到了这个问题.第1章,第1课,课程回顾4:
您需要创建一个仅包含值类型的简单类或结构.您必须创建类或结构,以使其尽可能高效地运行.您必须能够将类或结构传递给过程,而无需担心过程将对其进行修改.您应该创建以下哪项?
参考类
B参考结构
C值类
D值结构
正确答案:D
不正确:你可以创建一个引用类; 但是,它可以在传递给程序时进行修改.
B不正确:您无法创建参考结构.
C不正确:您可以创建一个值类; 但是,结构往往更有效率.
D正确:价值结构通常是最有效的.
这对我来说非常时髦,显然开发人员应该使用关键字out但我不相信这甚至可以工作:
public BusinessResponse<MyResultType> MyMethod(){
BusinessResponse<MyResultType> res = new BusinessResponse<MyResultType>();
ProcessResult(res);
return res; //this has the values set by ProcessResult!!! How?
}
private void ProcessResult(BusinessResponse<MyResultType> result)
{
result.State = BusinessResponseState.Success;
//set some other stuff in the result argument
}
Run Code Online (Sandbox Code Playgroud)
我的同事说这被称为"深度参考",我不敢相信这在C#中起作用.我会重构使用out
aka private void ProcessResult(out BusinessResponse<MyResultType> result)
但我仍然想知道为什么这段代码有效.
UPDATE
所以看起来我不正确,这段代码很好.似乎情绪是,作为C#开发人员,我应该立即知道,因为传递给processResult的参数是堆上的引用类型,通过值传入引用本身的副本,并且复制的引用仍然指向同一个对象.
我一直在努力彻底了解参考和价值类型.就在我以为自己拥有它的时候,我遇到了这个场景......
我创建了一个包含单个对象的类.
class Container
{
public object A {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
当我创建此Container类的实例(a)时,我正在创建引用类型的实例.我为类中的对象分配了一个整数.据我所知,这将被装箱作为对象,另一种参考类型.
int start = 1;
Container a = new Container{ A=start };
Run Code Online (Sandbox Code Playgroud)
我创建了Container类的另一个实例(b),但是为它分配了第一个容器的值,b的值现在是对a的引用.
Container b = a;
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,当我打印出aA和bA的值时,它们是相同的.
Console.WriteLine("a.A={0},b.A={1}",a.A,b.A);
//a.A=1,b.A=1
Run Code Online (Sandbox Code Playgroud)
并且,正如预期的那样,当我更改aA的值时,bA的值也会因为它们引用相同的对象而发生变化.
a.A = 2;
Console.WriteLine("a.A={0},b.A={1}",a.A,b.A);
// a.A=2,b.A=2
Run Code Online (Sandbox Code Playgroud)
现在我决定尝试使用单个本地对象.再次,我将整数打包到第一个对象中,并将第一个对象的值分配给第二个对象.我认为此时的对象应该是引用类型,因此c和d应该引用相同的对象.不改变任何东西,它们返回相同的值.
int start = 1;
object c = start;
object d = c;
Console.WriteLine("c={0},d={1}",c,d);
// c=1,d=1
Run Code Online (Sandbox Code Playgroud)
像以前一样,在更改初始对象的值时,我希望两个对象的值相同.
c = 2;
Console.WriteLine("c={0},d={1}",c,d);
// c=2,d=1
Run Code Online (Sandbox Code Playgroud)
当我打印这两个对象的结果时,d的值不像以前那样改变.
有人可以解释为什么这个场景中的作业与之前的作业有所不同吗?
谢谢