March 5, 2015
Angular2 and TypeScript
This is awesome for the Client side scripting world! I LOVE both of the languages and the features and safety of each. Great collaboration!
February 18, 2015
HTTP 2 is finally done
Finally the specs for HTTP 2 were finalized yesterday and will be integrated into Chrome 40 and a new FireFox coming over the next 10-12 weeks. Here are some of the things to expect.
http://thenextweb.com/insider/2015/02/18/http2-first-major-update-http-sixteen-years-finalized/
https://www.mnot.net/blog/2014/01/30/http2_expectations
http://gizmodo.com/what-is-http-2-1686537168
http://thenextweb.com/insider/2015/02/18/http2-first-major-update-http-sixteen-years-finalized/
https://www.mnot.net/blog/2014/01/30/http2_expectations
http://gizmodo.com/what-is-http-2-1686537168
September 10, 2014
How not to do Dependency Injection
Dependency Injection (DI) is not a new concept and has been discussed, blogged, and published many times. There are a huge number of books out there on the subject. I've seen many usages and implementations of it used by various clients I've consulted for.
Like the author of the blog post I refer to below, one of the most common and mis-used, abuses of, and antipatterns I've seen is the wrapping of the DI model in a static container.
I recently found an excellent article that explains in great detail why this is a bad idea and a big anti-pattern - http://www.devtrends.co.uk/blog/how-not-to-do-dependency-injection-the-static-or-singleton-container.
Hopefully, this will help improve your understanding of what DI is and how it should not be used.
Like the author of the blog post I refer to below, one of the most common and mis-used, abuses of, and antipatterns I've seen is the wrapping of the DI model in a static container.
I recently found an excellent article that explains in great detail why this is a bad idea and a big anti-pattern - http://www.devtrends.co.uk/blog/how-not-to-do-dependency-injection-the-static-or-singleton-container.
Hopefully, this will help improve your understanding of what DI is and how it should not be used.
May 24, 2012
References to missing Types or Methods in referenced DLL
Ever wonder what happens if you have a binary reference to an external .dll and decide not to recompile the application or library that references/depends on it? You can get some strange errors depending on the changes that have been made.
Ever experienced a BadImageFormatException, ExecutionEngineException, TypeLoadException, or MissingMethodException?
Firstly, the manifest file for the dependent app/library is not updated pointing to the new version. This can cause mismatched assembly version errors (BadImageFormatException).
Here are the results from some tests with the removal of types and/or methods on a referenced assembly (hereinafter referred to as ‘Bad Assembly’). All tests were done with x86 Console App/Library in separate solutions with a “static hardcoded” path reference to Bad Assembly (x64 shouldn’t matter):
HTH
Firstly, the manifest file for the dependent app/library is not updated pointing to the new version. This can cause mismatched assembly version errors (BadImageFormatException).
Here are the results from some tests with the removal of types and/or methods on a referenced assembly (hereinafter referred to as ‘Bad Assembly’). All tests were done with x86 Console App/Library in separate solutions with a “static hardcoded” path reference to Bad Assembly (x64 shouldn’t matter):
- Results were always the same for Release/Debug builds.
- The bad assembly was always successfully loaded. ‘fuslogvw’ (.NET Assembly Load Viewer) confirmed this.
- Setting the reference to Bad Assembly as “Specific Version” (using v1.0.0.0) and changing the version on Bad Assembly to v1.1.0.0 had no effect. However, I didn’t try defining Bad Assembly in the “assemblies” section of the app.config. It is possible that would have given a different result.
- References to a missing Type OR calls to a missing Method from Bad Assembly in "static void Main()" resulted in a "System.ExecutionEngineException" (fatal error as shown below). This exception cannot be caught by any means: Assembly events, AppDomain events, try/catch block in "static void Main()". I confirmed this thru WinDbg. This is because it is the first method that the EE (CLR Execution Engine) tells the JIT to compile. Since JIT happens on a method-by-method basis and "static void Main()" is the entry point for the app, there is no place “upstream” where an exception can be caught. The error in the Event Viewer is completely cryptic and provides no indication what went wrong.
- If the reference to a missing Type OR calls to a missing Method from Bad Assembly occurred “downstream” of "static void Main()" AND there WAS NOT exception handling upstream, OR there WAS exception handling upstream but the exception was rethrown so that is was never caught again, then results were same as #4. (i.e. unhandled exception)
- If the reference to a missing Type OR calls to a missing Method from Bad Assembly occurred “downstream” of "static void Main()" AND there WAS exception handling upstream, then the exception was caught as either a "System.TypeLoadException" or "System.MissingMethodException" respectively. The exceptions were thrown from the JIT as the Type or Method was accessed.
HTH
May 18, 2012
Why you should use ReadOnlyCollection<T>
Many people believe that you should be using
Just as a side note, every time that a
List<T>
to return collections from a public API. However, there are several reasons not to do so; instead return a ReadOnlyCollection<T>
. The are several benefits of
using a ReadOnlyCollection<T>
:
- The *collection itself* cannot be modified - i.e. you
cannot add, remove, or replace any item in the collection. So, it keeps the
collection itself intact. Note that a
ReadOnlyCollection<T>
does not mean that the elements within the collection are "readonly"; they can still be modified. To protect the items in it, you’d probably have to have private “setters” on any properties for the reference object in the collection – which is generally recommended. However, items that are declared as[DataMember]
must have both public getters and setters. So if you are in that case, you can’t do the private setter, but you can still use theReadOnlyCollection<T>
. Using this as a Design paradigm can prevent subtle bugs from popping up. One case that comes to mind is the case of aHashSet<T>
. It is recommended to avoid having mutable properties onclass
orstruct
types that are going to be used in any collection that utilizes the types hash code to refer to an object of that type - e.g.HashSet<T>
, - Performance: The
List<T>
class is essentially a wrapper around a strongly-typed array. Since arrays are immutable (cannot be re-sized), any modifications made to aList<T>
must create a complete copy of theList<T>
and add the new item. Note that in the case of value types, a copy of the value type is created whereas, in the case of reference types, a copy of the reference to the object is created. The performance impact for reference types is negligible. The initial capacity for aList<T>
is 4 unless specified thru the overloaded constructor - see here. https://learn.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.collectionsmarshal.getvaluereforadddefault Obviously, this can be very bad for memory and performance. Don’t forget that not only the items directly within theList<T>
itself are copied – but every value and object with the entire object graph for that reference type. This could easily contain other references types, collections, etc. This is why it is recommended to create/initialize aList<T>
instance with the overloaded constructor which takes anint
denoting the size of theList<T>
to be created when possible. This can often be done since you are typically iterating on a "known" size value at runtime. For example, creating aList<T>
of objects from a "Repository or DataService" method may iterate/read from aIDataReader
object which has a property ofRecordsAffected
. If you are going to be putting an item in theList<T>
based on the number of times theIDataReader
is read: e.g.while(reader.Read())
you can easily create the list like so:
if (reader != null && reader.RecordsAffected > 0)
{
// initialize the list with a pre-defined size
List<Foo> someList = new List<Foo>(reader.RecordsAffected);
while (reader.Read())
{
someList.Add(...);
...
}
}
Just as a side note, every time that a
List<T>
needs to grow in size (its new size would exceed its current Capactity
, the size is *doubled*. So,
if you happen to add just one more item to a List<T>
that wasn’t
constructed with a pre-determined size, and the List<T>
expands to
accommodate the new item, there will be a whole lot of unused space at the end
of the List<T>
even though there aren’t any items in it – bad for memory
and performance.
Subscribe to:
Posts (Atom)