If we’re copying arrays where the types may be different, sometimes we may want to do an atomic copy; that is if any of the elements in the source array can’t be converted to the destination array type, the whole copy operation will “rollback” and the target array will remain unchanged.
The Array.ConstrainedCopy method can do this for us.
Consider the code below where an array of objects (containing a string and and an int) is copied to a target array of type string.
Using .CopyTo will result in an exception and the target array being partially affected (the target array element 0 will have already been populated with the string).
Using .ConstrainedCopy will ensure that if an exception occurs the target array will be “rolled back”, i.e. none of it’s elements will have been changed.
var things = new object[] { "Sarah", 1};
var strings = new string[2];
// this will throw an exception because of the 2nd element conversion error (int to string)
// but, the target array "strings" would have been changed (the 1st string element will have been copied)
things.CopyTo(strings, 0);
// this will throw an exception because of the 2nd element conversion error (int to string)
// BUT, the target array "strings" will NOT have been changed
Array.ConstrainedCopy(things, 0, strings, 0, 2);
The constrained copy has the following parameters (from MSDN):
public static void ConstrainedCopy(
Array sourceArray,
int sourceIndex,
Array destinationArray,
int destinationIndex,
int length
)
For more C# tips, feel free to check out my C# Tips and Traps Pluralsight course.
SHARE:
Sometimes the display and formatting of information in the Visual Studio debugger is less than optimal.
The DebuggerDisplay attribute allows us to customise how an object is portrayed in the debug window.
Imagine a Person object p with an AgeInYears and an Name property.
By default, in the debugger this would look like:

At the “root” level for the object we just get the type name.
If we override ToString() then we would get that output here instead.
If we want to override ToString() but have a different output at the root debug level we can apply the DebuggerDisplay attribute at the class level:
[DebuggerDisplay("This person is called {Name} and is {AgeInYears} years old")]
class PersonWithDebuggerDisplay
{
[DebuggerDisplay("{AgeInYears} years old")]
public int AgeInYears { get; set; }
public string Name { get; set; }
}
In the string we supply to the DebuggerDisplay attribute we can reference properties, fields, and methods in the class by wrapping them in {}.
This produces the following in the debugger:

Note that in the sample code above, the DebuggerDisplay attribute is also added to the AgeInYears property which produces the following when the object is expanded in the debugger:

The DebuggerDisplay attribute can be applied to:
- Classes
- Structs
- Delegates
- Enums
- Fields
- Properties
- Assemblies
While this is not something we’d use on every class as a matter of course, it may be helpful when we are doing a lot of debug work and we want to make life easier for ourselves. For more info on usage check out MSDN.
For more C# tips, feel free to check out my C# Tips and Traps Pluralsight course.
SHARE:
My latest Pluralsight course: C# Tips and Traps is now live.
It’s a collection of things to: “Short-circuit your learning of C# with this smorgasbord of handy C# and .NET features.”
It's sometimes hard to know what you don't know
Description: Whether you're still learning C# or you already have some experience, it's sometimes hard to know what you don't know. This course is designed to short-circuit your C# learning and provides a whole host of useful information about the sometimes under-used or unknown features of both the C# language and the .Net framework. It's suitable for those who are brand new to C# as well as experienced developers looking to "round off" their C# skills and "fill in the gaps".
You can watch C# Tips and Traps Pluralsight course now, also if you have a Plus level subscription you can also get access to all the demo code exercise files used in the course and play around with the things yourself.
SHARE:
I was asked a question about this on Twitter, so thought I’d create a quick post about it.
The example below shows how to use a DataTemplate that is defined in XAML with a ListView control that is dynamically created in the code behind.
1 Create a New WPF Application
Create WPF application project in Visual Studio.
2 Create The basic XAML
Replace the contents of the MainWindow XAML to the following:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<DataTemplate x:Key="DaysDataTemplate">
<Grid Background="Cyan">
<TextBlock Text="{Binding}"></TextBlock>
</Grid>
</DataTemplate>
</Window.Resources>
<Grid Name="RootContainer" />
</Window>
This defines a DataTemplate called DaysDataTemplate that simply binds the value and has a cyan background so we can see if it is being applied.
We also give the root container (Grid) a name RootContainer so we can reference it later in the code behind.
More...
SHARE:
Disclaimer: some of the software used below is pre-release, use at your own risk...
This article assumes basic knowledge of writing C# and using Visual Studio - it doesn't assume any prior knowledge of Raspberry Pi or Linux.
My Parts List
You can find a list of verified peripherals here, below are the specifics of what I'm using successfully:
- Raspberry Pi Model B (from element14 Australia)
- 1 metre high speed HDMI lead (from element14 Australia)
- Microsoft Comfort Curve 3000 USB keyboard;
- Logitech M100 USB mouse;
- SanDisk 16GB Ultra SDHC Card, Class 10, "up to 30 MB/s 200X"
- Nokia AC-USB phone charger (output: DC 5 volt 1 amp*)
- Cat 5 Ethernet cable (wired to Belkin wireless bridge/extender)
* It's important to have a sufficiently powerful supply.
Preparing the Operating System
Download Soft-float Debian “wheezy” image from http://www.raspberrypi.org/downloads.
Extract the .img from the zip file.
Download Win32 Disk Imager http://www.softpedia.com/get/CD-DVD-Tools/Data-CD-DVD-Burning/Win32-Disk-Imager.shtml (make sure you get the correct link as there's lots of advertising and other download links on the page).
More...
SHARE:
Introducing MoqaLate
Whilst I love developing apps for Windows Phone 7, the testing aspect is hard! I'm a TDD-er by default and it's such a pain to have to hand roll my own mock objects.
So I created MoqaLate.
It's an alpha version but is usable now.
Not sure framework is the right term but it's something that generates mocks from your interfaces.
Add to existing project from NuGet:
PM> Install-Package MoqaLate
Read more about the project.
Download an example solution.
Read (currently very basic!) documentation.
View on NuGet.org
Awesome overview diagram :)
SHARE:
Sometimes you want to tell the view to play an animation (Storyboard). One simple way to do this is to define a StartStoryboardMessage class, populate this with the name of a Storyboard to play, then send it to the Messenger.
public class StartStoryboardMessage
{
public string StoryboardName { get; set; }
public bool LoopForever { get; set; }
}
In the viewmodel when you want to tell the view to play an animation:
Messenger.Default.Send(new StartStoryboardMessage { StoryboardName = "TimerFinAnimation",LoopForever=true });
The view (i.e. in the code-behind) registers for these messages:
Messenger.Default.Register<StartStoryboardMessage>(this, x => StartStoryboard(x.StoryboardName, x.LoopForever));
...
private void StartStoryboard(string storyboardName, bool loopForever)
{
var storyboard = FindName(storyboardName) as Storyboard;
if (storyboard != null)
{
if (loopForever)
storyboard.RepeatBehavior = RepeatBehavior.Forever;
else
storyboard.RepeatBehavior = new RepeatBehavior(1);
storyboard.Begin();
}
}
SHARE:
With MVVM Light you can get into a situation where you code-behind's message handler gets called multiple times.
If the ctor for the view is registering for a message then the every time the view loads another subscription will be added; then when the message is sent the are effectively 2 'listeners' which end up executing the registered Action method multiple times.
One solution to this is to make sure you un-register when the view unloads.
The example below shows the code-behind for a simple settings page that registers for a DialogMessage in the ctor, and un-registers when the page is done with.
public partial class Settings : PhoneApplicationPage
{
public Settings()
{
InitializeComponent();
Messenger.Default.Register<DialogMessage>(this, DialogMessageHandler);
}
private void DialogMessageHandler(DialogMessage message)
{
var result = MessageBox.Show(message.Content, message.Caption, message.Button);
message.ProcessCallback(result);
}
private void PhoneApplicationPage_Unloaded(object sender, RoutedEventArgs e)
{
Messenger.Default.Unregister(this);
}
}
SHARE:
One thing that can quickly become messy when writing unit tests is the creation of test objects. If the test object is a simple int, string, etc then it's not as much of a problem as when you a list or object graph you need to create.
Even using object initializers you can end up taking a lot of lines of indented code, and gets in the way of the tests.
One solution is to use a 'builder' class which will construct the object for you.
For example, rather than lots of initializer code you could write:
_sampleData = new HistoryBuilder()
.WithTimer(false, 1, 1, new DateTime(2000, 1, 1))
.WithTimer(false, 1, 1, new DateTime(2000, 1, 1))
.WithTimer(true, 1, 1, new DateTime(2000, 1, 1))
.Build()
You can multiple overloads of WithTimer (for example one which create adds a default Timer).
Implementation of HistoryBuilder:
public class HistoryBuilder
{
private readonly History _history;
public HistoryBuilder()
{
_history = new History();
}
public HistoryBuilder WithTimer()
{
_history.Timers.Add(new Timer());
return this;
}
public HistoryBuilder WithTimer(bool completed, int internalInteruptions, int externalInteruptions,
DateTime time)
{
_history.Timers.Add(new Timer
{
Completed = completed,
InternalInteruptionsCount = internalInteruptions,
ExternalInteruptionsCount = externalInteruptions,
StartedTime = time
});
return this;
}
public History Build()
{
return _history;
}
}
SHARE:
If you register for a message in the ctor of your views code-behind, eg:
Messenger.Default.Register<DialogMessage>(this, DialogMessageHandler);
Every time you reload the view, i.e by navigating to it, the callback method (in this example DialogMessageHandler) can get called multiple times from the previous times ctor ran.
To fix this all you need to do create an event handler for the PhoneApplicationPage Unloaded and unregister the message (you can unregister more specifically using one of the other overloads):
Messenger.Default.Unregister(this);
SHARE: