我已经查看了this链接。有一个问题,通常有一个不可思议的术语"参考"。首先,我想澄清何时在我看来一个Type是一个引用类型。
这是非引用类型的行为。
string bla = "abc";
string blob = bla;
bla = "cde";
// bla = "cde" and blob = "abc"
这是引用类型
的行为 Person jens = new Person("Jens");
Person frank = jens; // doesn't make any sense i know
frank.Name = "Frank";
//jens.Name = "Frank" and frank.Name = "Frank"
正如您所看到的,只有在引用时才传递一个引用(如c中的指针)。您还可以使用参考关键字来实现非参考类型的行为。
我要搜索的是Type类的属性,它指示类型是否为引用类型。
它也应该适用于结构,只适用于您可以存储的所有内容"其中的东西。
根据我上面提供的链接,有多个属性,都略有不同
我需要使用哪一个? 他们似乎都不符合我的条件。
抱歉我的英语不好:)
答案 0 :(得分:1)
String
是一种特殊的内置类型,如Int32
或Double
,它具有特殊属性,您可以将其表示为C#中的文字值。两者也恰好都是immutable types,我认为这可能与你正在努力解决的问题有些相关。
我的猜测是你对C#中的引用含义做了一些错误的假设。两种语言都使用了reference
和struct
这两个词,但它们各自的含义却截然不同。
在第二个示例中,frank
和jens
都是对相同实际对象的引用。可以把它们想象成是内存中相同地址的指针 - 因为在那里的某个地方,它们是。
看起来您相信当您将jens
分配给frank
时,您正在调用复制构造函数。如果jens
和frank
是C ++中的堆栈变量,那将会发生什么。但C#不是C ++。 C#引用是可重新绑定的。就赋值而言,它就像C ++中的指针,而不是C ++引用。但是与C ++指针不同,你不能做"指针算法"有了它,你不需要取消引用它。
在C#中,如果要复制引用类型的实例,例如String
或(显然)Person
,则需要明确地执行此操作。
// Assume Person has a Person(String name) constructor
Person bob = new Person("Bob");
// This assigns a **reference to bob** to a new reference variable.
// steve and bob are now referencing the same object. Not what you want.
Person steve = bob;
// Person should have a copy constructor. If that's done correctly,
// this will create a COPY of the object that both steve and bob
// refer to.
Person bob2 = new Person(steve);
// Because we explicitly created a new instance for bob2, this won't
// affect the other "Bob" instance that bob and steve still refer to.
bob2.Name = "Bob Junior";
A"非参考" C#中的类型称为struct
。 DateTime
就是一个例子。复制时,C#struct
的行为类似于堆栈上的C ++类实例:它是一个隐式副本。
// DateTime is a struct. It's IsValueType, NOT IsClass.
// Different behavior.
DateTime today = DateTime.Now.Date;
// This creates a copy, because DateTime is a struct not a class.
DateTime alsoToday = today;
这只是(值得称赞的)对语言的一般好奇心,还是您尝试解决的具体问题?我经常发现,当有人问你为什么要这么做时?"答案使我们比专注于您尝试用来解决问题的特定技术更有帮助。像这样的问题通常暗示OP选择了错误的解决方案。
答案 1 :(得分:0)
IsValueType
正是您要找的。 p>
请注意:string
实际上是参考类型。