简体   繁体   中英

How do I find out something is a struct(value type) or a class(reference type) in C#

I am using someone's SDK, but the document does not tell me something is a struct or a class.

How can I find out that? typeof or GetType just show the name.

I'd like find out that in the IDE(VS2010); approaches through coding are also acceptable.

Programmatically speaking, you can use GetType().IsValueType .

From Visual Studio, you can also check by using the Object Browser (shown below, found under View -> Object Browser).

对象浏览器

As mentioned, you can find out whether a generic type is a class type or value type by calling IsValueType on the type object. Note, however, that it's not meaningful to test whether an object instance is a value type. Although C# will pretend that a reference-type fields can hold a value-type instance, that's an illusion. For every value type there is a corresponding class type with the same name and fields. Calling GetType().IsValueType on a storage location holding a reference to such an instance will report true, even though the storage location in fact holds a reference to a class object. This can be demonstrated readily with structs that implement mutating interfaces (eg List<string>.Enumerator , which I'll call LSE for short).

An LSE which is stored in a variable of type LSE will behave as a value type. Copying an LSE which is about to return the third item of a list to another variable of type LSE will yield a second, independent enumerator, which is also about to return the third item. One can read items from either enumerator without affecting the other. By contrast, if one has a variable of type IEnumerable<string> which holds a reference to an LSE , and one copies that to another variable of type IEnumerable<string> , one will have a second reference to the same enumerator. Reading items from one enumerator will also advance the other. In other words, copying an LSE to a reference-type storage location will yield something which will behave like a reference type because, under the covers, it will actually be one.

Note that calling GetType on a storage location won't reveal whether it holds a real value type, or whether it holds an object of the class associated with a value type. In the former case, the system will create a new instance of the class associated with the value type and call GetType on that, so in both cases the GetType call will actually be processed on a class-type instance.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM