Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# supports value types and reference types, but are they all objects?

I know C# has both value and reference types, but how can you do a this:

int age = 100;

string blah = age.ToString();

If age is a value type, how does it have a ToString method on it? Does it get converted to an object ONLY when required internally then?

like image 495
Blankman Avatar asked Jul 06 '09 13:07

Blankman


People also ask

What C is used for?

C programming language is a machine-independent programming language that is mainly used to create many types of applications and operating systems such as Windows, and other complicated programs such as the Oracle database, Git, Python interpreter, and games and is considered a programming foundation in the process of ...

What is the full name of C?

In the real sense it has no meaning or full form. It was developed by Dennis Ritchie and Ken Thompson at AT&T bell Lab. First, they used to call it as B language then later they made some improvement into it and renamed it as C and its superscript as C++ which was invented by Dr. Stroustroupe.

Is C language easy?

C is a general-purpose language that most programmers learn before moving on to more complex languages. From Unix and Windows to Tic Tac Toe and Photoshop, several of the most commonly used applications today have been built on C. It is easy to learn because: A simple syntax with only 32 keywords.

How old is the letter C?

The letter c was applied by French orthographists in the 12th century to represent the sound ts in English, and this sound developed into the simpler sibilant s.


3 Answers

If age is a value type, how does it have a ToString method on it?

Value types are allowed to have methods on them. Why wouldn't they? A method "on a type" is just a hunk of code that happens to be associated with a particular type; why do you believe that it matters whether that type is classified as a "reference type" or "value type"?

That's not a rhetorical question. I am interested in learning about what intuitions people have about code, particularly when those intuitions are incorrect. By understanding what people get wrong intuitively, we can try to come up with better abstractions that are more intuitive.

Does it get converted to an object ONLY when required internally then?

What exactly do you mean by "converted to an object"? Do you mean "boxed"?

There are many situations in which a value type must be boxed. Some of them are straightforward -- like when you cast a value type to object or an interface. Some of them are obscure. (There are bizarre situations in generic methods where we must box and unbox things in ways you might not expect.)

In this particular situation there is no boxing. Calling a method directly implemented on a value type simply calls that hunk of code. There's no need to treat the thing as "object"; the hunk of code we're calling knows the type of the thing.

like image 62
Eric Lippert Avatar answered Oct 07 '22 09:10

Eric Lippert


You want to look up boxing/unboxing.

Boxing

like image 32
Russell Troywest Avatar answered Oct 07 '22 09:10

Russell Troywest


System.Int32 inherits System.ValueType which inherits System.Object.

All class, struct, enum, array, nullable and delegate types eventually derive from object. All interface types and type parameter types are implicitly convertible to object. And all pointer types neither derive from nor are convertible to object

like image 43
ng5000 Avatar answered Oct 07 '22 08:10

ng5000