.NET 中的大多数类型都派生自作为类的对象。所以你可以说所有这些都是类,但是其中一些派生自 ValueType ,它们的行为与引用类型不同。引用类型是大多数人在谈论类时所指的。在这方面,值类型,例如 int、bool 和任何(其他)结构都不是类。
接口既不是类也不是结构/ValueType,它是一个接口。
int x = 0; //0代表的对象是int类型,是ValueType
x.ToString(); //ToString 是由基类型 Object 实现的,它是一个类
(IComparable)x).CompareTo(1); //System.Int32 实现了那个接口
抛开装箱不谈,上面说明了根据您对它的看法,一个对象可能被归类为 ValueType、Class 或 interface
真正要担心的不是某个东西是类、接口还是其他东西。因为根据您的看法,大多数对象都在一组以上。要记住的关键是某事物是否具有值语义(结构/值类型)或引用语义。每当您将具有价值语义的东西分配给其他东西时,都会制作一份副本。另一方面,如果您分配具有引用语义的东西,那么您只是在使用别名
public struct Foo{
public int x;
public Foo(int x){
this.x = x;
}
}
//value semantics
Foo x = new Foo(1)
Foo y = x;
//reference semantics
object xx = new object();
object yy = xx
Object.ReferenceEquals(x,y); // <-- returns false;
Object.ReferenceEquals(xx,yY); // <-- returns true;
如果您不小心,那么在将值类型视为具有引用语义或其他方式时,您可能会遇到一些难以发现的错误
public class Baz {
private Foo _myFoo = new Foo(1);
public Foo MyFoo {
get{
return _myFoo;
}
}
}
Foo bar = new Baz();
bar.MyFoo.x = 789; // <-- returning a copy of _myFoo not a reference to that object
if(barMyFoo.x == 1){
Console.WriteLine("This will be written to console because bar.x is 1!");
}