Friday, December 2, 2016

With the release of Visual Studio 2017 RC, you can now explore the upcoming C# 7 features. In this post let’s see how you can use Deconstructors in C# 7.

Please do not get confused in Deconstructors with Destructors as Destructors has nothing to with Deconstructors.

Basically what a Constructor would do is, it will create a new object of given type with given parameters (here I am opting out the default constructor as it has no parameters). So what the Deconstructor would do is, it will deconstruct the object back into it’s original parts. To be specific, you have the control of specifying how would you like the object to be deconstructed.

Let’s go by an example. Here I have a class named Employee, and there is a Constructor which accepts two parameters, First Name & Last Name, and those are being set to Employee’s properties. (Please note that as of today no errors are thrown by the compiler if you have a return type other than void in Deconstructor methods. In other words current Deconstructors lets you return values even though it doesn't make any sense. Microsoft is aware of this and they will get it fixed in the coming releases.)

publicclass Employee

{

publicstring FirstName { get; }

publicstring LastName { get; }

public Employee(string firstName, string lastName)

{

FirstName = firstName;

LastName = LastName;

}

}

Above code is pretty simple. And now let’s see how we can add a Deconstructor to Employee.

publicclass Employee

{

publicstring FirstName { get; }

publicstring LastName { get; }

public Employee(string firstName, string lastName)

{

FirstName = firstName;

LastName = LastName;

}

publicvoid Deconstruct(outstring firstName, outstring lastName)

{

firstName = FirstName;

lastName = LastName;

}

}

It’s simple, isn’t it. The only thing we need to have is, we should have a public void method named Deconstruct and one or more properties that I want the object to be deconstructed into, should be specified as out parameters.

Now let’s see how we can call the Deconstructor.

Employee employee = new Employee("Jaliya", "Udagedara");

var (firstName, lastName) = employee;

Console.WriteLine(firstName);

Console.WriteLine(lastName);

Here something to note is Deconstructor is being invoked by C# 7 Tuple syntax. If you are not aware about the Tuples in C# 7, please read this previous post of mine.

And the following will be the output.

Output

And the nice thing is, you can have multiple Deconstructors with different parameters (that’s basically method overloading).

publicvoid Deconstruct(outstring firstName, outstring lastName)

{

firstName = FirstName;

lastName = LastName;

}

publicvoid Deconstruct(outstring firstName)

{

firstName = FirstName;

}

The respective Deconstructor invocations are as follows.

// first deconstructor invocation

var (firstName, lastName) = employee;

// second deconstructor invocation

var (firstName1) = employee;

If you still couldn’t download Visual Studio 2017 RC, download and try out these new C# 7 features.

Thursday, December 1, 2016

Response Compression is if client browser supports response compression, the server sends the content compressed, so the response size is reduced. There are couple of compression schemes, but almost all the browsers supports gzip and deflate. In this post let’s see how you can use Response Compression Middleware in an ASP.NET Core application to serve the content compressed using gzip.

I am going to use Visual Studio 2017 RC and let’s create an ASP.NET Core Web Application targeting .NET Core and I am selecting the template as Web API as I want to simulate large content being sent to the client.

Once the project is created and all the dependencies are restored, let’s update all our dependencies to ASP.NET Core 1.1. Please note that Visual Studio 2017 RC targets ASP.NET Core 1.0.1 for it’s default ASP.NET Core templates as it’s the LTS (Long Term Support) version as of now.

Update Nuget Packages

Once update is completed, let’s modify Get() action in default ValuesController to return some large set of data.

[HttpGet]

public IEnumerable<string> Get()

{

List<string> someStrings = new List<string>();

for (int i = 0; i < 100000; i++)

{

someStrings.Add($"Value{i}");

}

return someStrings;

}

Now let’s just run the application, trigget Get() action in ValuesController and explore the request and response information.

First if we examine the request headers, it looks likes follows.

Request and Reponse Headers

I am using Chrome and it seems that my current version of Chrome supports set of compression types. But in the response there was no indication the content which got received is compressed.

Response Size

Size of the content received is 1.2 MB.

Now let’s add some code to send the content compressed using gzip. Let’s add a new nuget package to the project and that is Microsoft.AspNetCore.ResponseCompression.

Install Microsoft.AspNetCore.ResponseCompression

Now let’s modify the ConfigureServices method and Configure method in startup.cs to add and use Response Compression Middleware.

// This method gets called by the runtime. Use this method to add services to the container.

publicvoid ConfigureServices(IServiceCollection services)

{

services.AddResponseCompression(options =>

{

options.Providers.Add<GzipCompressionProvider>();

});

services.AddMvc();

}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.