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
SUMMARY

The discussion centers on the 'var' type in C#, specifically its classification as strong or weak typing. Participants argue that while 'var' allows for type inference, it does not compromise the strong typing of C# since the actual type is determined at compile time, eliminating the need for runtime checks. The conversation also highlights the convenience of using 'var' in reducing verbosity in type expressions, particularly in template programming and complex expressions in libraries like Boost's uBLAS.

PREREQUISITES
  • Understanding of C# type systems and type inference
  • Familiarity with template programming in C++
  • Knowledge of Boost libraries, specifically Boost uBLAS
  • Basic concepts of strong vs. weak typing
NEXT STEPS
  • Explore C# type inference and the implications of using 'var'
  • Learn about template programming in C++ and its advantages
  • Investigate Boost uBLAS and its expression templates
  • Study the differences between strong and weak typing in programming languages
USEFUL FOR

Software developers, particularly those working with C# and C++, as well as educators and students interested in type systems and programming language design.

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
2K
Replies
65
Views
5K
  • · Replies 22 ·
Replies
22
Views
4K
  • · Replies 1 ·
Replies
1
Views
1K
Replies
63
Views
5K
  • · Replies 13 ·
Replies
13
Views
4K
  • · Replies 34 ·
2
Replies
34
Views
4K
  • · Replies 1 ·
Replies
1
Views
2K
Replies
2
Views
2K
  • · Replies 3 ·
Replies
3
Views
3K