We all know C# does not offer multiple inheritance but offers arguments that programmers can live without it. It is true in almost all cases, especially all cat and animal or employee and manager projects. I have seen a few cases where if C# offered multiple inheritance, the solution would have been natural, elegant and succinct.
Imagine that I have a component (UI, non-UI, doesnβt matter). You can make calls into the component, which does some interesting work for you. Imagine that the component takes an interface IComponentCallback
to notify its parent. So I would do is have my parent class derive from IComponentCallback
interface and pass this to the component. The code would look something like this:-
There are two facilities in C# to determine the size of a type β sizeof
operator andMarshal.SizeOf
method. Let us discuss what they offer and how they differ.
Before we settle the difference between sizeof
and Marshal.SizeOf
, let us discuss why would we want to compute the size of a variable or type. Other than academic, one typical reason to know the size of a type (in a production code) would be allocate memory for an array of items; typically done while using malloc
. Unlike in C++ (or unmanaged world), computing the size of a type definitely has no such use in C# (managed world). Within the managed application, size does not matter; since there are types provided by the CLR for creating \ managing fixed size and variable size (typed) arrays. And as per MSDN, the size cannot be computed accurately. Does that mean we donβt need to compute the size of a type at all when working in the CLR world? Obviously no, else I would not be writing this post.
Senthil has left us thrilled in his new post, and also inspired me to write about the topic. Although, anonymous delegates have become a mundane stuff amongst programmers, there is still these subtle stuff left unexplored. Alright, let us try to answer Senthilβs question before he unravels the mystery in his next post.
A delegate is identified by its target. The target is the method to be executed on a delegate invocation and its associated instance or type. If the target is an instance method, the delegate preserves the target method pointer and the object instance. If the target is a static method, the delegate preserves the target method pointer and the type to which it belongs. So when a code like the one below to register a method to an event (or multicast delegate) is executed, a delegate object (EventHandler here) with the target information embedded is created and added to the invocation list of the event (or multicast delegate, KeyPressed here).
More ...
Let us read some code:-
int SomeMethod()
{
int num = 1;
try
{
num = 5;
return num;
}
finally
{
num += 5;
}
}
What is the return value of SomeMethod
? Some anonymous guy asked that question in the code project forum, and it has been answered. I am writing about it here because it is interesting and subtle. One should not be surprised when people misinterpret finally. So let us take a guess, 10
(i = 5
, then incremented by 5 in the finally block).It is not the right answer; rather SomeMethod
returns 5
. Agreed that finally
is called in all cases of returning from SomeMethod but the return value is calculated when it is time to return from SomeMethod, normally or abnormally. The subtlety lies not in the way finally is executed but in the return value is calculated. So the return value (5) is decided when a return is encountered in the try block. The finally is just called for cleanup; and the num
modified there is local to SomeMethod
. So make the return value 10
, it is no use being hasty making SomeMethod
return from the finally block. Because returning from finally
is not allowed. (We will talk about it later why returning from catch
block is a bad practice and why can’t we return from finally
block). Had such modifications been done on a reference type, they would have been visible outside of SomeMethod
, although the return value may be different.
Article co-authored with Sanjeev, and published on CodeProject
Every application logs a whole bunch of diagnostic messages, primarily for (production) debugging, to the console or the standard error device or to files. There are so many other destinations where the logs can be written to. Irrespective of the destination that each application must be able to configure, the diagnostic log message and the way to generate the message is of our interest now. So we are in need of a logger class that can behave transparent to the logging destination. That should not be a problem, it would be fun to design that.
More ...This is a simple array like class for C++, which can be used as a safe wrapper for accessing a block of memory pointed by a bare pointer.
This is about a killer bug identified by our chief software engineer in our application. What was devised for ease of use and write smart code ended up in this killer defect due to improper perception. Ok, let us go!
CComPtr
is a template class in ATL designed to wrap the discrete functionality of COM object management β AddRef
and Release
. Technically it is a smart pointer for a COM object.
I would not want to write chunks of code to spawns threads and perform many of my background tasks such as firing events, UI update etc. Instead I would use the System.Threading.ThreadPool class which serves this purpose. And a programmer who knows to use this class for such cases would also be aware that the tasks queued to the thread pool are NOT dispatched in the order they are queued. They get dispatched for execution in a haphazard fashion. More ...
Remember the Casting Restrictions we discussed a while back, let us settle that now. So we have some code like this:
object obj = i;
long l = (long)obj;
And an invalid cast exception while casting βobjβ to long. It is obvious that we are not changing the value held by obj, but just reading it. Then why restrict such casting. Let us disassemble and see what we got.
.locals init (
[0] int32 i,
[1] object obj,
[2] int64 l
)
L_0000: nop
L_0001: ldc.i4.s 100
L_0003: stloc.0
L_0004: ldloc.0
L_0005: box int32
L_000a: stloc.1
L_000b: ldloc.1
L_000c: unbox.any int64
L_0011: stloc.2
L_0012: ret
Oh, there we see something interesting - unbox
. So the C# compiler uses the unbox
instruction to retrieve the value from obj
while casting; it does not use Convert
.ToInt64
or similar mechanism. That is why the exception was thrown.
Thanks to the internet. If nobody else bothers or understands what loss of data means, you can shout it aloud here. I lost 500GB of data - every moment of my personal and professional life captured in bits and bytes.
It is a Western Digital Premium Edition external hard disk (USB/Firewire). I bought it despite my friend warning of bad sectors and hardware issues that WD is known to have. As with any story, one fine morning, I was copying some songs, pictures from my pen drive to the hard disk. All of a sudden, the hard disk and my laptop hung up. I restarted the system thinking I would make fresh start. But to my dismay, all my drives on the hard disk had vanished like dust. I tried connecting and reconnecting a few times, the drives showed up once or twice like a sick man’s last few breadths.
More ...