Local Functions in C#7.0

Posted: July 30, 2017 in .NET, C#
Tags: ,

The nested functions (methods) or local functions are functions defined inside another function , referred to as the enclosing function. The nested functions are available only within the scope of the enclosing functions. This is nothing new. The nested functions has been there in languages like ALGOL , PASCAL , Lisp , JavaScript for quite sometime and even in modern programming languages like Scala.

Can we do similar stuff in C#?

image

Suppose in the snippet above we want to extract out the computation logic in a separate function. A quick way will be to extract it out to separate private function. But that will be bit confusing, because the scope of the private method will not be restricted to the method Calculate and it will be a class level method. So someone reading the code later, will have difficulty to understand, that my intent was to have this private method only to be used by the Calculate method.

One way of doing this will be to define an anonymous method within the Calculate method. But here I have to define a delegate (type definition) and create a delegate object (first class object in itself) to cater to my simple need of having just a helper function.

image

C#7.0 helps us to achieve this with the feature of local functions , another syntactic sugar coat and added compile time checks. The code below shows how we can define nested local function within another method in C#7.0.

image

This local function gets compiled into a compiler generated private method as shown below, without adding any added overhead.

image

image

Advertisements

Deconstruction in C#7.0

Posted: July 29, 2017 in .NET, C#
Tags: , ,

In my earlier blog post related to Tuples, I had used the following two ways for accessing the elements of the tuple.

image

image

The first one is obviously inefficient and to be honest wrong, there is no point calling the method twice. The second one can be simplified further as shown in the snippet below:

image 

This is referred to as the deconstruction of the tuple.

This technique of deconstruction can be now applied to any . NET class/struct , by implementing the Deconstruct method.

image

The object instance can be then deconstructed back into three variables as shown below:

image

The code shown above is nothing but the syntactic sugar coat. The decompiled code clearly shows the Deconstruct method of the Person class getting invoked and the variables a , b & c does not exists in the complied code. These are replaced by variables declared with names same as the parameters of the Deconstruct method implementation.

image

Tuples in C#7

Posted: July 29, 2017 in .NET, C#
Tags: , ,

What is a tuple ? -  A tuple is an ordered group of elements.

Tuple has been there as a data type in most of the functional programming languages like Lisp , Haskell since their inception.

For example in Haskell , tuple provides a mechanism to store multiple values together. One key difference with a List is, tuple allows to store multiple values of different data type.

image

In C#4.0, Generic Tuple class(es) was introduced, the primary intent was to make it interoperable with languages like Python / F#. This also provided an easy way to return multiple values from a method without defining a separate class or structure.

image

The tuple values could be accessed using the Item property of the tuple class as shown below:

image

We will tweak the above code as follows:

image

We will not be able to modify the element values as these Item properties are read-only making the tuples immutable.

image

There are about 8 overloads of Tuple.Create method and 8 Tuple classes allowing us to tuples up to 8 elements.

So far so good , but if I compare the C# snippet with it is Haskell counterpart it looks cumbersome. It looks kludgy , as if some feature has been artificially dumped into the language.

This is further improved in C#7 with elegant syntactic sugar coat and the System.ValueTuple structure doing the work in background.

This feature is now built into the framework (4.7) and if you are using 4.6.2 or earlier,  the package reference to System.ValueTuple needs to be added.

image 

Like me , if you are using Visual Studio Code you just need to run the command “dotnet add package "System.ValueTuple" from the Terminal, followed by a “dotnet restore”.

image

We can now refactor our earlier code using much simpler and more elegant syntax as shown below:

image

The tuple values could be accessed similarly using the Item property as shown below:

image

We can further improve this by leveraging the new feature of providing tuple element names.

image

These element names are used while accessing the values, making the code more readable.

image

Unlike Tuple classes , the ValueTuple structure is mutable and it allows us to modify the values.

image

The decompiled ( by dotPeek) shows how ValueTuple structure is doing it’s job. The code below looks quite similar to what we did earlier with Tuple class. The named tuple elements are implemented using the attribute System.Runtime.CompilerServices.TupleElementNames. TupleElementNames stores the element names as a string array.

image

image

C# 6.0 – nameof Operator

Posted: January 1, 2016 in .NET, C#
Tags: ,

In this post, we will discuss about the C# 6.0 nameof operator.

In the code snippet below we are trying to the details i.e Class & method names whenever a method is invoked. In real life applications we do similar kind of logging using any logging library.

image

The issue here is we have used string literals to refer to the class and method names. As the number of methods and corresponding log entries increases it becomes difficult to track these and also typos etc. may creep in creating more clutter.

In C# 6.0 the nameof operator gives us a provision to get the names of classes, methods,properties, variables etc. in the form of unqualified strings. The changed version of the code using nameof operator is shown below:

image

This gives as better manageability as the tools and IDE can have better track of these names now. Suppose I am renaming the class in that case Visual Studio track this down very easily as shown in the figure below

image

As obvious this is nothing but a very handy syntactic sugar coat. If we take a look into the IL code, we can easily see nothing heavy duty is going on inside. The compiler is simply replacing the nameof calls by the unqualified string literal name of the class and the method.

 

image

Yesterday we were having a discussion about how we can extend Backbone.js so that we can have a separate controller with action methods the way we have in ASP.NET MVC rather putting the callbacks to be executed based on route matching in the Backbone.Router.One point which I mentioned casually is , “Javascript” does not sophisticated reflection like C# so that we can build a Router/Action Selector/Action Invoker/Controller sort of a pipeline.Later I thought that was very casual statement and not a very correct one.The kind of language Javascript is we do not need that kind of reflection and Javascript offers various ways to dynamically invoke functions.In this post we will explore different mechanisms of invoking functions in Javascript. We will start with the following simple code.

image

Here the “execute” function calls “func” and the function “func” defined in T is executed. Now let’s try to tweak the function “execute” in such a way so that it will accept a object  and a function name as parameter and execute that function defined in that object.

image

Here we are using the “apply” function of Javascript which is available for any function object. The definition of apply is as shown below:

apply([thisObj[,argArray]]) where

  • thisObj is the object that will be used as "this" i.e. object on which the function will be invoked
  • argArray is the argument array used to pass argument values to the function which is invoked

obj[func]” retrieves the function object based on the function name from the hash of “obj” and then “apply” is invoked on that function object.

As a next step let’s modify our function to accept few parameters.

image

The parameters are passed using the array p.

There is another Javascript function “call” which can be invoked on any function object to bind a particular object to it. This is defined as:

call([thisObj[, arg1[, arg2[,  [, argN]]]]]) where

  • thisObj (optional) -   The object to be used as the current object on which the function is invoked
  • arg1, arg2, , argN (optional list) -  A list of arguments to be passed to the method.

The main difference with “apply” is in the way the parameters are handled, instead of a parameter array it accepts individual parameters.This makes it rigid compared to “apply”.

The following code shows the use of call.

image

If you are using Underscore.js this can be achieved more easily with _.bind function.

_.bind(function, object, *arguments) where

  • function  is the function object which needs to be invoked
  • object is the current object on which the function is invoked
  • *arguments are arguments values which the function expects

Our sample code is modified with _.bind

image

The _.bind function internally uses apply as shown below.

image

In this post we will discuss about the scope of a javascript variable and how “hoisting” works in javascript. Let’s start with a simple global variable definition.

image

In this code “a” is defined as a global variable and should be accessible to all the functions.So quite naturally the function “f” will print “global” i.e. value of the global variable “a” in the console.

In the code below, we have introduced a small change and added declaration of another variable named “a” in the function “f”.

image

Here the program will give precedence to the local variable “a” and will print “local” to the console. So far it’s quite intuitive.

image

Here we are trying to access the value of “a” first followed by the local variable declaration of same name and then again printing it’s value to the console. Most of us would expect to the following in the console.

global

local

It will print the following instead:

undefined
local

This happens because the way javascript handles variable declaration and initialization.It first scans the function and finds out all the variables and declares them on top but does not initialize them. Then when the code executes it provides the initialization value in the actual line where its defined. So when the first console.log statement executes it sees that there is a variable named “a” defined but not initialized so it will print “undefined”.

This is how variable hoisting (moving to the top) works in javascript where the declarations are only hoisted and not the initialization.

So this can lead to undesirable behavior and it is safe to declare the variable at the top of the function before its use.

In my last post, we have seen how to define models in Backbone.js and create instances of their objects.In this post we will see how we can set & get attribute values in Backbone.js model.Backbone.Model exposes two functions set and get to do so. The code snippet below shows the use of these functions.

image

The code below tries to access one non-existent attribute’s (“c” in this case) value which obviously will return undefined.

image

We can handle this situation in an elegant way using the has function. The has function returns true/false based on whether a property exists or not.

image

The attributes attribute and the toJSON function returns the dump of the attributes & the value in JSON format. The code below will print “Object { a=2, b=4, c=5}”.

image

The unset function removes a particular attribute from the object hash.

image

The clear function will clear the entire object hash removing all the attributes.

image

So now we have covered mostly all the Backbone.js functions related to attribute manipulation. However we can provide model specific functions for getting/setting attributes instead of directly using the get & set methods as shown below.

image

image

In the next post, we will move change listeners and tracking in the model.