2005 2006 2007 2008 2009 2010 2011 2015 2016 aspnet azure csharp debugging exceptions firefox javascriptajax linux llblgen powershell projects python security services silverlight training videos wcf wpf xag xhtmlcss

IE8, CSS, and Other Critical Standards

Early this morning I read that there is an internal build of IE8 that supposedly renders the Acid2 test perfectly.  When hearing about this, I'm sure there were crowds of naive developers rejoicing and singing praise.  That's great, but I'm not one of them.  The reason is simple: CSS is only one standard.

Passing the Acid2 test brings a great deal of weight of the reliability of a web browser, but as an AJAX specialist, my core technologies are the DOM and JavaScript.  This is why I could use Firefox 1.5 and 2.0 even though they were only somewhat close to passing the ACID2 test (though this didn't stop me writing writing Mozilla a letter or two!)

People seem to forget that JavaScript is also a standard (by ECMA-International, who also has C#-- ironic?)  Furthermore, the DOM is a standard.  I can easily deal with strange stuff going on in CSS by using more images in place of text or by using IE conditional CSS (a feature the other browsers need).  It's just one of the many standards required to be a proper web browser.  Honestly, I can even deal with their weak implementation of JavaScript, because it handles closures, namespaces, and higher-order functions fine.

The problem I hit... every... single... day... however, is their lack of strong DOM support.  There are just SO few things you can do with the DOM in IE!  I don't even mean the awesome stuff like being able to access a mouse selection is a safe way, but something simple and common like being able to use addEventListener instead of attachEvent.  Even the Silverlight team thought it was important to add support for that (in their first release too!)

In addition to the DOM, I should also mention that this is not the end of the standards list.  Firefox, Opera, and Safari all take HTML5, Canvases (part of HTML5), and SVG for granted.  IE has absolutely no support for these standards.  I'm sure more avid standards specialists could go on and on, listing even more standards that IE lacks and that others have had for a while.  We just can't forget about the other technologies.  We only complain about CSS because it's partially supported and therefore it reminds people of its sloppiness in IE, prompting us to talk about it.  Since we haven't seen them in IE, most don't consider than as important, but if we had them in IE, then we wouldn't have to complain so much about the CSS support.  We would have more standards-based visual technologies to help us get to the same end.

Lastly, I would like to mention again that "standard" not only means "common, same, or basis for comparison", but it also refers to a certain level of quality.  So, even if the IE team were to pass the Acid2 test, support JavaScript 1.5+, and add support for the addEventListener function, they would have to continually and consistently prove their integrity by releasing a major update either annually or bi-annually to keep up with the technologies.  It's very important to keep changing with technology and to keep going with the flow.  IE's lack of proper web technology support has held web technology back for way too long.

I don't think most people realize how significance of a technological boost Firefox 1.0 was when it first came on the scene!  It wasn't just a new browser or some neat piece of technology.  It was like someone dropped a Lexus LS 2008 into a local car in 1991.  It shouldn't have been that way though.  The IE team had the most power and with that power came the responsibility to lead the charge.  They failed.  To this day, the Firefox and Opera guys are very hard working people who are constantly putting out new updates and therefore are constantly proving that even though they aren't perfect, they are willing to stay with the times and provide regular updates.  The IE team has to prove themselves in the same way and I'm confident that myself and my fellow web developers will completely accept IE when it becomes a proper web browser.

Therefore, I'm not too excited about IE8 passing the Acid2 test; I was much more excited when Opera did.  It's awesome that they finally got that far, but the IE team has a TON of things that must be done before IE can start playing with the big boys again.  Personally, I think they should just do what Apple did with OS9 and just rewrite the entire thing from scratch.  I also think they should recreate the IE team with some of the best of the best from other portions of Microsoft.  The web browser is arguably the most used application on a PC today and it is therefore worthy of our best resources.  Microsoft could even rewrite the entire thing in .NET to prove to the world the amazing power and efficiency of .NET and feed two birds with one scone!

Opera Sues Microsoft Over Web Standards

I'm not going to go into too many details here, but I just wanted to point out that Opera has filed a complaint with the European Union against Microsoft for "...tying its browser...to the Windows operating system" and for "...hindering interoperability by not following accepted Web standards."  The article goes into all kinds of the same old anti-trust stuff, but it also mentions that Microsoft's technology "creates a de facto standard that is more costly to support, harder to maintain, and technologically inferior and that can even expose users to security risks."

This is tremendous huge win for anyone who 1) has respect for the web, 2) don't like segmenting QA plans to including an entire segment to IE support testing, or 3) likes to have a little self respect left over after a pure-AJAX project.  For years I've been saying that someone needs to take the IE team up on war crimes, but this filing by Opera is definitely a step in the right direction.  Perhaps someday we web developers will have the freedom to create rich client-side applications without having to add special support for the world's most "special" browser.

It's just absolutely unacceptable that someone that can infuse such a product into the world's information infrastructure and think they can get away with it.  If the WCF team had the same quality-control standards as the IE team, then SOAP would never, ever communication with anything.  If the networking stack guys had the that low of standards, can you even imagine trying to communicate between a "Microsoft TCP/IP" client and and Apache server?  Microsoft is an excellent company with great products and amazing standards, but the IE team seems to be absolutely against these things.  Sometimes people seem to forget that the word "standards" isn't just a word meaning "common, same, or basis for comparison", but that it also refers to a certain level of quality.  I've said it before and I'll say it again: the IE team has no standards (I feel a bumper-sticking coming on!)

Do yourself and the world a favor by downloading and supporting Mozilla Firefox, Apple Safari, or Opera.  Each of these are proper 7th generation web browsers, unlike Intranet Explorer whose existence is analogous to those half dead, temporary batteries that sometimes come with your kid's toys.  They are meant to be replaced.  So, if you are getting someone a computer for Christmas, give them the gift of one of these web browsers so they don't have to drag their muddy feet all over the Internet.

Links

  • Mozilla Firefox - Great CSS support, absolutely unsurpassable JavaScript and DOM support, and the ability to write browser extension with just JavaScript and CSS.
  • Apple Safari - Great font anti-aliasing with support for many of the same shortcut keys as Firefox.  A little quirky on the JavaScript and DOM side, but it's constantly improving.  I love Safari.  I usually keep Safari up most of the day when I'm working on Firefox specific projects that require me to do a lot of restarting.
  • Opera - Great support for CSS and continually improving JavaScript support with an amazing set of user features.  A little awkward for people not used to it though.

Firefox 3.0 Beta 1 Features

A few days ago Firefox 3.0 Beta 1 was released.  This is a major revision packed with some seriously awesome features.  Here's a rundown of some of the major features for normal users, power users, and developers (this is not an exhaustive list, but it covers a lot of ground-- also note that I've only tested Firefox 3.0 Beta 1 on Windows):

SQLite - SQLite databases are now used to store cookies, download history, a new concept called "Places" and other things.  This information being stored in a series of databases (in *.sqlite files) means that we can use SQLite front-ends to do SQL CRUD queries against the stored information.  Even if we don't use the SQLite databases directly, developers from all over the world will be able to create very powerful extensions to the features using the SQLite databases.  There's already at least one SQLite manager built as a Firefox extension.  Firefox has actually been using SQLite for a while, but it's only really been used for XUL and extension development.  If you are unfamiliar with SQLite, you should seriously check into it-- it's really awesome.  It's also the storage system for Google Gears.

Places - As I just mentioned, the new concept of "Places" is also stored in the database.  This feature tracks web surfing trends similarly to how various media players track music listening trends.  So, after a bit of surfing you'll be able to see what pages you visit most often.  Places also shows what bookmarks you have recently tagged, your most recently used tags, and a few other things.  Even if we don't use this feature in Firefox as is I'm sure more extensions will be built to help make Places more useful.  I can already visualize an extension to mash Places metadata with your Windows Media most-popular metadata to give you a view of all your favorite things in one place.

Tags and Easier Bookmarking - Firefox 3.0 also introduces del.icio.us-like tags to bookmarks.  This isn't that big of a deal to me, because with Firefox 2.0 you could install the del.icio.us bookmark extension to replace your static Firefox bookmarks to allow del.icio.us manage all your bookmarks.  It was so integrated that CTRL-D even sent your bookmark to del.icio.us.  The exciting part of Firefox 3.0 tagging is that the next del.icio.us extension will probably be faster and even easier to use in Firefox 3.0 since Firefox now has built in mechanisms for this.  Using the Firefox 3.0 tags feature by itself is nice too, though.

Coupled with this feature is the ability to simply click on a star to have your page sent to "Places" (it's actually very similar to the star in Gmail).  Another click of the star gives you a nice out-of-the-way box to set tags on the link.  It's actually very similar to what the del.icio.us extension did in Firefox 2.0, thus making me think even more that there will soon be an awesome del.icio.us extension for Firefox 3.0.

ACID2 Test Passed - It's official: Internet Explorer is the only major web browser that doesn't pass the ACID2 test (and it doesn't get near it).  Firefox has always been close (yes, since V1.0 it has the shape of a face) , but it finally crossed the finish line.  Internet Explorer's rendering on the other hand still looks like someone slaughtered a pig.  If you don't know what the ACID2 test is, it's THE test for a web browsers CSS usefulness.  The better the rendering, the better the browser can render.  As you will see in a moment, Internet Explorer is SO far off that it's not even CLOSE to being a 7th generation web browser (...and I do not apologize for bashing IE -- there's always time for that.)

Here are the renderings of Firefox 3.0b1, Opera 9.24, Safari 3.04, and Internet Explorer 7 (and 6) for the ACID 2 test:

Firefox 3.0 Beta 1

Opera 9.24

Safari 3.0.4 (Windows)

Internet Explorer 7 (this is a scaled version-- click for full)

Internet Explorer 6 (also scaled-- click for full).

Sheesh... notice any similarities? If you think IE7 is a major improvement over IE6, think again. It's just the 6th generation IE6.5 in a 7th generation skin (i.e. has tabs and integrated search).  Adding XMLHttpRequest doesn't make it a 7th generation browser (XMLHttpRequest was NOT in IE before IE7-- before IE7, the IE world had only ActiveX controls and Java proxies for remote scripting.  These are the opposite of standardized components.)  Trying adding window.addEventListener, removing that horrendous ClearType, and getting somewhere near the shadow of the ball park of the ACID2 test and we'll talk.

JavaScript 1.8 - Some people know it and take it for granted, yet others don't realize it and are offended by it: Firefox has the most powerful JavaScript in any web browser at all.  Most of us know that Internet Explorer's CSS is just about nonexistent, but most people don't know that Opera's analogous in the area of JavaScript.  Safari is a close second.  Firefox is the only web browser that continually and consciously has a constant flow of documented JavaScript features.  Internet Explorer is actually pretty good in this area (I know-- it's shocking) and Opera is continually getting better and better, but Firefox is head and shoulders above everyone else (and none of this is to even mention how are advanced Firefox' DOM implementation is -- Firefox even has native base64 conversion functions!). 

Firefox 1.5 had JavaScript 1.6, which included iterative methods (i.e. forEach), like in C# 2.0, and E4X.  Firefox 2.0 had JavaScript 1.7, which provided a functional programming feel to JavaScript similar to LINQ's functional nature.  Firefox 3.0 now has JavaScript 1.8 and takes JavaScript functional programming to the next level by including lambda expressions.  If you love C# 3.0, you will love JavaScript 1.8.  Firefox 3.0 may or may not also have client-side JSON serialization.  If it does, it should seriously fit nicely with the WCF 3.5 JSON feature.  By now, any one who still sees Firefox as anti-Microsoft technology needs to repent.

There are also new DOM features, like two new drag events and support for Internet Explorer's clientTop and clientLeft attributes.  Firefox 3.0 also has a scriptable idle service allowing you to check to see how long as user has been idle.  I wish I had that 8 years ago when I created a web-based screen saver for a kiosk.  Another thing I wish I had years ago is Firefox 3's new getElementsByClassName function.  Since it's native (C++) it's MUCH faster than any artificial JavaScript implementation (see John Resig's benchmarks.)

For more information on Firefox' powerful development capabilities, check out the MDC (Mozilla Development Center-- the Firefox equivalent of MSDN).  There you will find a detailed references for the DOM, JavaScript, AJAX, XSLT, CSS, SOAP, XML-RPC, SVG, Canvas (which was Silverlight before Silverlight and native to Firefox, Safari, and Opera-- notice which browser is missing?), XUL, and a whole host of other technologies you probably never knew existed or never knew were native in Firefox.  If you do ANY client-side web development, you need to check out these references and keep them close by.  The samples alone will save you hours of wasted debugging.

Lower Memory Utilization - Now, to be clear I'm not one of those far too uptight people who cry every time SQL Server uses multiple GBs of memory.  On the contrary I'm usually ecstatic to see that I'm actually using the memory that I paid so much money for.  I'm not too uptight about Firefox using a lot of memory either as I know it's caching everything it sees.  Since I use Firefox more than anything else, I have no problem with it using more memory than anything else-- that includes Photoshop.  However, Firefox 3.0 uses a lot less memory.  You can do simple configuration tweaks in Firefox 2.0 to make it use a lot less memory and to even release memory when you minimize and this all without any extensions, but Firefox 3.0 cleans up the memory as you go.  As I was watching the memory charts of Firefox, I was shocked to see it return 30MB of memory upon closing a tab.  Now it's going to be Safari that's the target of memory usage paranoid.

Webmail Handlers - This isn't a feature I've seen yet, but I'm really hoping comes to Gmail soon.  I'll just quote the release notes: "...web applications, such as your favorite webmail provider, can now be used instead of desktop applications for handling mailto: links from other sites. Similar support is available for other protocols (Web applications will have to first enable this by registering as handlers with Firefox)."  If Gmail does that registration, I'll finally be able to replace Google Chat as my mailto handler.

Offline Applications - This needs to be explicitly utilized by the developers of each particular web application, but now Firefox theoretically doesn't need Google Gears in order to use online application locally.  Firefox 2.0 already had one interesting offline feature in the form of HTML 5's sessionStorage attribute.  This feature was conceptually similar to ASP.NET's ViewState in that it persists across page refreshes, but not across pages.  Firefox 3 included two new events for offline functionality: "online" and "offline".  When an application goes offline, the offline event is raise and similarly with the online event.   I've checked out these events and they are rock-solid.  There are also other offline application features in Firefox 3.0, but they aren't that well documented yet.  You can see an example of the concept of office applications by using Google Reader and Google Gears.  I expect this feature to be available in Gmail soon and hopefully without ever needing a plugin.

One Click Website Info - When you click on the website icon in the address bar you get a box of information telling you a little about the website.  Really what were talking about here is SSL websites.  You can click the icon to get a quick view of the SSL information.  I personally just like the idea of not having to double-click.  I know, I'm picky.  It's the little things in life that make the difference, right?

Native viewing of ZIP files - This feature is not that well documented from what I've seen, but it's really awesome!  It allows you to view ZIP and JAR files directly in Firefox 3.0 by using the following pattern: jar:http://www.mywebsite.com/MyZipFile.zip!/.   Thus jar:http://www.davidbetz.net/dotnetcourse/CSharpLanguage.zip!/ (copy, don't click) views the contents of one of my course samples.  You know you're intrigued now.

There are also many new security features like the forged website blocker which stops you (or, your relatives) from going to verified phishing web sites and malware protection which does the same for malware web sites.  There are also user experience enhancements.  Now when you type in the address bar you are filtering by page title and URL, compared to just filtering by URL previously.  Also, zooming now attempts to zoom images and text, not just text, though I'm not finding that to be all that successful; safari on the iPhone/iPod touch still owns that one.  Other development features include support for animated PNGs (APNG), the ability to use a web service as a content handler, support for rgba and hsla colors, and... ready for this? Cross-site XMLHttpRequest!  That's right, we will finally be able to do cross-domain AJAX without script block hacks!  Other normal user/power user features include a permanent restart button (in Tools->Add-ons), a much better application content-type screen, a really, really nice page info window which includes a cookie viewer and the supposed ability to enable and disable images, popup windows, cookies, and extension and theme installations per web site.

On the negative side, the new download window is absolutely horrible.  Firefox' download manager and download options actually get worst with each major Firefox release.  The download setup is finally as bad as Safari's.  Firefox 1.0 had absolutely the best download setup I've ever seen.  You could go to the options screen and with the click of a button, a My Downloads folder was created and downloads would start going there.  That actually made sense!  In Firefox 1.5, they got rid of that awesome selling point, forcing you to make the folder yourself or suffer having all your downloads be thrown all over your desktop.  Lame.  At least in Firefox 1.5 you could click the button next to "All files downloaded to:" and have access to your downloads in a folder view of your desktop.  In Firefox 3.0 you can't even do that! I'm never getting to my downloads again! Well, not never, because the Firefox developer have to be smart enough to fix that and even if they aren't, Firefox has an awesome extension system that allows anyone to make a quick fix using XML, JavaScript and CSS.  Furthermore, the download manager API has been updated so extension developers can do much more.  It's also been moved from RDF to SQLite, thus allowing even more extensibility.

With all these additions, it's not hard to see that Firefox 3.0 is a major upgrade over previous versions pushing the Firefox dynasty even further in the face of its competition (that is, Opera and Safari-- IE isn't in the ball park.)  Some would criticize this statement though and possibly even say that I have double standards.  They would say that when Firefox gets a feature I proclaim it as awesome and slam other browsers for not having it, but when those other browsers get a feature that Firefox lacks, I ignore it.  To be sure, when other browsers get a feature that it lacks I very much criticize Firefox for it.  Their lack of perfection on the ACID2 test in Firefox 2.0 was a good example and their lousy download manager in Firefox 3.0 beta 1 is another.  I slammed them rather hard for that and submitted/voted for all kinds of other bugs in Firefox.  Furthermore, I love other browsers as well.  For example, because of it's beautiful anti-aliasing and support for the CTRL-L and CTRL-K shortcuts, I use Safari about as much these days.  Even still, Firefox is leaps and bounds ahead of the rest.  The zip viewer means nothing, the SQLite is only "cool", the "Places" is something I'm not too excited about, because it's the JavaScript, CSS, DOM and extension support that actually matters.  Web browsers need to be standards compliant and have a strong development feature set to be acceptable in today's web.  Opera will probably always be flashier, but Firefox will probably always be smarter.

As I've stated initially, there's more to Firefox 3.0 than what I've mentioned here.  If you want to know more about any point of Firefox 3.0, just check out the many links above or the developer notes below.  For more developer information, I highly suggest going to the Mozilla Developer Center.  For other information, just check out the release notes and it's links.

Related Links

New XAG Feature: Support for C# 3.0 Automatic Properties

One of the nicest features of C# 3.0 is one of the most subtle: automatic properties.  It's really nothing more than syntactical sugar and saves us a little bit of typing, but it's been a big help in making my code more self-documenting.  If you're unfamiliar with automatic properties, here is what one looks like:

public Int32 Id { get; set; }

When that single line is compiled and viewed in Reflector, you get the following:

[CompilerGenerated]
private int <Id>k__BackingField;

public int Id
{
    [CompilerGenerated]
    get
    {
        return this.<Id>k__BackingField;
    }
    [CompilerGenerated]
    set
    {
        this.<Id>k__BackingField = value;
    }
}

The new syntax is equivalent to a classic C# property.  Note that this property has a get accessor and a set accessor.  This is the only type of automatic property you will be able to create.  You need the full {get; set; } for the automatic property to compile.  { get; } or { set; } won't cut it.  If you need a property with only a get or set accessor, then you need to use a classic C# property.  However, you can use { get; private set; } for a read-only property.  It will create both accessors, but only the get accessor will be public.  Also keep in mind that the Visual Studio 2008 code-snippet shortcut "prop" now creates an automatic property and "propg" creates an automatic property with a private set accessor.

Since this feature helps so greatly in the readability of the code, I have added a new feature to XAG: minimized properties.  Here is what the classical C# 2.0 syntax would look like for simple DTO (data transfer object) using XAG:

<Assembly xmlns:x="http://www.jampadtechnology.com/xag/2006/11/">
    <SimpleType x:Key="ClassKey" Type="Class" AutoGenerateConstructorsByProperties="True" Namespace="ClassNamespace"  AccessModifier="Public">
        <Properties AccessModifier="Public">
            <Id Type="Int32" />
            <Name Type="String" />
            <Title Type="String" />
        </Properties>
    </SimpleType>
</Assembly>

Using XAG's express type creation, the XML compiles to the following C# code:

using System;

namespace ClassNamespace
{
    public class SimpleType
    {
        private Int32 id;
        private String name;
        private String title;
        public Int32 Id {
            get { return id; }
            set { id = value; }
        }

        public String Name {
            get { return name; }
            set { name = value; }
        }

        public String Title {
            get { return title; }
            set { title = value; }
        }

        public SimpleType(Int32 id, String name, String title) {
            this.Id = id;
            this.Name = name;
            this.Title = title;
        }

        public SimpleType( ) {
        }
    }
}

That's painfully verbose when compared with automatic properties.  The new feature in XAG allows you to choose between a classic property and a minimized property (an automatic property in C# 3.0).  Below is the same XAG DTO done with Minimized properties.  In this example, notice that AutoGenerateConstructorsByProperties is set to false (the default).  This is because C# 3.0 has feature called object initializers, which allow you to set properties when you instantiate an object without needing any special constructor.

<Assembly xmlns:x="http://www.jampadtechnology.com/xag/2006/11/">
  <SimpleType x:Key="ClassKey" Type="Class" Namespace="ClassNamespace" AccessModifier="Public">
    <Properties AccessModifier="Public" Minimized="True">
      <Id Type="Int32" />
      <Name Type="String" />
      <Title Type="String" />
    </Properties>
  </SimpleType>
</Assembly>

By simply setting Minimized to true (and optionally, AutoGenerateConstructorsByProperties to false), you get the following C# 3.0 code:

using System;

namespace ClassNamespace
{
    public class SimpleType
    {
        public Int32 Id { get; set; }
        public String Name { get; set; }
        public String Title { get; set; }

        public SimpleType( ) {
        }
    }
}

You can also use this new minimize option with the existing options Static (a Boolean) and Mode (Blank, "GetOnly", or "SetOnly"), but you obviously can't use it with the Backing option.   The Backing option has a default value of true which means that the property is backed by a private field.  There is no such thing as an automatic property with an explicit backing field; that's the entire point of an automatic property.  The following example demonstrates a few legal combinations for properties in XAG.  Notice that you can tell XAG that you want all but a few specified properties to be minimized.

<Assembly xmlns:x="http://www.jampadtechnology.com/xag/2006/11/">
    <SimpleType x:Key="ClassKey" Type="Class" Namespace="ClassNamespace"  AccessModifier="Public">
        <Properties AccessModifier="Public" Minimized="True">
            <Id Type="Int32" />
            <Name Type="String" Static="true" Mode="GetOnly" />
            <Title Type="String" Minimized="False" Backing="False" Mode="GetOnly" />
        </Properties>
    </SimpleType>
</Assembly>

This XML code compiles to the following C# 3.0 class:

using System;

namespace ClassNamespace
{
    public class SimpleType
    {
        public Int32 Id { get; set; }

        public static String Name { get; private set; }

        public String Title {
            get { throw new Exception("The method or operation is not implemented."); }
        }

        public SimpleType( ) {
        }
    }
}

In C# 3.0, you could use that code with an object initializer like this:

SimpleType st = new SimpleType( )
{
    Id = 8
};

Int32 id = st.Id; // id == 8

You can find more information about my XML Assembly Compiler at http://www.jampadtechnology.com/xag/.

Related Links

.NET Framework 3.5 Released

If you don't already know, .NET 3.5 is finally out and with it came VS 2008.  I've been using it full time for many months now and there are some features which I've come to love and others which I find completely worthless.  Here is a quick break down of what I find cool (be sure to check out the links section to see more resources):

Notice I didn't mention anything about ASP.NET AJAX becoming native (or should I say naive?). This is an incredibly poorly designed technology bordering on the quality of Internet Explorer (ok ok, not even a leaky nuclear core is quite that bad).  The JavaScript intellisense is a complete joke and only gets in the way, the Sys namespaces pollute the Firebug watch window so you can never see your objects, and the syntax is painfully non-intuitive.    The only nice feature it has its it's does have is the ability to allow you to access ASMX services from JavaScript.  Having said that, the year is almost 2008.  It's not 2002 and therefore we use WCF, not ASMX.  In WCF 3.5 we can very easily create very flexible and powerful REST-based JSON services (adding straight XML support if needed with a single endpoint configuration element).  There's just no need to have SOAP turn your 6-byte request into a 300 byte message.  It adds up.  So, ASP.NET AJAX ("Atlas") is complete obsolete in my book. If you want to do real AJAX, then learn the fundamentals and whip out prototype/script.aculo.us and use WCF 3.5 for your service interaction.

Accelerated C# 2008 Now, if you're looking for an awesome resource for learning/mastering .NET 3.5 and C# 3.0, I highly recommend the book Accelerated C# 2008 by Trey Nash. It gets right to the point and doesn't mess around with entry-level nonsense. You get the knowledge you need right away and from it I estimate an experience induction of at least 7 months.

For full .NET Framework 3.5 examples, check out my Minima .NET 3.5 Blog Engine (on which this site runs) and my ESV Bible Web Service 2.0 Framework for .NET 3.5.

Links

Powered by
Python / Django / Elasticsearch / Azure / Nginx / CentOS 7

Mini-icons are part of the Silk Icons set of icons at famfamfam.com