Understanding 'var' Type in C#: Strong or Weak Type?

  • Thread starter Thread starter haki
  • Start date Start date
  • Tags Tags
    Type Weak
Click For Summary

Discussion Overview

The discussion centers around the nature of the 'var' type in C#, specifically whether it should be classified as a strong or weak type. Participants explore the implications of type inference in strongly typed systems, contrasting C# with Java and discussing the utility of 'var' in programming.

Discussion Character

  • Debate/contested
  • Technical explanation
  • Conceptual clarification

Main Points Raised

  • One participant argues that C# is no longer strongly typed due to the introduction of 'var', suggesting it acts as a placeholder rather than a specific type, which they consider weak.
  • Another participant counters that C# remains strongly typed because the compiler infers the actual type at compile time, eliminating the need for runtime checks.
  • A third participant expresses reluctance to use 'var', comparing it unfavorably to JavaScript.
  • A later reply highlights the usefulness of 'var' in template programming in C++, emphasizing that it can simplify verbose type expressions and situations where the return type is not known.

Areas of Agreement / Disagreement

Participants do not reach a consensus on whether 'var' is weak or strong typing, with multiple competing views presented regarding its classification and utility.

Contextual Notes

Some participants express concerns about the clarity of code when using 'var', indicating a potential limitation in understanding the types involved. The discussion also touches on the differences in type systems between C# and Java, as well as the implications for template programming in C++.

haki
Messages
161
Reaction score
0
As far as I understand type systems in strongly typed system such as the one found in Java you must specify the exact type of the variable. Like e.g.

int x = 5; // strongly typed

also this would fail

Object x = 5;
Object y = "Not soo strong are we?";
Object z = x + y; // would throw a compiler error, since + operation is not defined on Object + Object, it is only defined on either Number + Number or String + String or String + Object

Now I said to a friend that C# is no longer strongly typed since in 3.0 you have the var variable which is more of a placeholder than a type, what kind of type is var? var can substitue any type therefore I would say that is weak type. He didn't agree on that one. I am left a bit puzzled. Is var type weak or not? I would say it is.
 
Technology news on Phys.org
It's still strongly typed because the compiler infers the actual type at compile time. In no case would it need a runtime check; I think in ambiguous cases the type must be supplied. It's just a matter of convenience I guess, but I don't understand why it is seen as a good thing. To me it seems that it would make code more difficult to understand.
 
Thanks for the answer. Yeah, I wouldn't dream of using var exept if I would write JavaScript.
 
var is a feature that would be very useful for template programming in C++.

Type expressions can get quite verbose; here's a simple one:

Code:
// Print everything in a container
template <typename Container>
void print_all(const Container &c) {
  typename Container::const_iterator iter = c.begin();
  while(iter != c.end()) {
    std::cout << (*iter++) << std::endl;
  }
}

Sometimes, you have to write stuff like typename Container::const_iterator a lot; it would be very convenient to be able to just write:

var iter = c.begin()


Even worse, sometimes you aren't even supposed to know the return type of an expression. For example, in linear algebra packages, if I write an expression like:

Code:
template <typename T>
void do_something(boost::numeric::ublas::vector<T> &a,
         const boost::numeric::ublas::vector<T> &b,
         const boost::numeric::ublas::vector<T> &c)
{
  a = 3 * b + 4 * c;
}

ublas generates efficient code for this function through the magic of expression templates: each of those arithmetic operations constructs a type that "knows" the parse tree of the expression. For example, the return type of 3*b is


typename vector_binary_scalar1_traits<int, vector<T>, scalar_multiplies<int, typename vector<T>::value_type> >::result_type


which is not only something you wouldn't want to have to type, it's something that you really ought not to even know about! If I wanted to do something like

Code:
var e1 = 3 * b;
var e2 = 4 * c;
a = e1 + e2;

then a keyword like var is the only reasonable option for doing so.
 

Similar threads

  • · Replies 2 ·
Replies
2
Views
3K
Replies
65
Views
5K
  • · Replies 22 ·
Replies
22
Views
4K
  • · Replies 1 ·
Replies
1
Views
2K
Replies
63
Views
6K
  • · Replies 13 ·
Replies
13
Views
5K
  • · Replies 34 ·
2
Replies
34
Views
4K
  • · Replies 1 ·
Replies
1
Views
3K
Replies
2
Views
2K
  • · Replies 3 ·
Replies
3
Views
3K