This time it's some nasty gotchas, some of them common, some of them obscure, that the C# compiler may or may not catch for you. The intended purpose of the code is described in the comments, you can try to figure out what goes wrong.
// replace A with B
var mystr = Console.ReadLine();
mystr.Replace("A", "B");
Console.WriteLine(mystr);
// has more than 1 second elapsed since last time?
var do_it_again = (DateTime.Now - last_time).Seconds > 1;
// replace sequences of vowels with "VOWELS"
words = Regex.Replace(words, "\b[aoeiu]+\b", "VOWELS");
// print out a matrix
for(var ii = 0; ii < rows; ++ii) {
for(var jj = 0; jj < columns; ++ii) {
Console.Write("{0} ", matrix[ii,jj]);
}
Console.WriteLine();
}
// rethrow exception
var can_recover = false;
try {
DoStuff(ref can_recover);
}
catch(ApplicationException ex) {
if(!can_recover) {
throw ex;
}
}
// spinwait for 100 ticks
long now = DateTime.Now.Ticks;
while((DateTime.Now.Ticks - now).Ticks < 100);
Retry();
// get a datestamp
DateTime.Today.ToString("dd/mm/yyyy")
// add items to work queue for processing
var list = GetDbValues();
lock(work_queue) {
for(var ii = 0; ii < list.Count; ++ii)
work_queue.Add(() => Process(list[ii]));
}
}
// run an action after 60 seconds
var timer = System.Timers.Timer(60.0);
timer.Elapsed += (_sender, _args) => Console.WriteLine("60 seconds have elapsed!");
// let's try again
var timer = System.Windows.Forms.Timer();
timer.Interval = my_interval;
timer.Tick += (_sender, _args) => Console.WriteLine("Time's up!");
// remove unwanted elements from a collection
foreach(var elem in list) {
if(ComplicatedLogic(elem)) {
list.Remove(elem);
}
}
// hash the contents of a dictionary
public long HashDict(Dictionary dict) {
long ret = 0;
unchecked {
foreach(var kvp in dict) {
ret += kvp.Key.GetHashCode() * kvp.Value;
ret << 1;
}
}
return ret;
}
// raise event
public event EventHandler StateChanged;
void OnStateChanged() {
StateChanged(this, new EventArgs());
}
// did it work?
bool worked = DidItWork();
if(worked = true) {
MessageBox.Show("Success!")
}
else {
MessageBox.Show("Oops!")
}
// let's make a simple struct
public struct MyStruct
{
int field1;
bool field2;
public override bool Equals(MyStruct struct2) {
return field1 == struct2.field1 &&
field2 == struct2.field2;
}
}
// ok, let's try with a class
public class MyClass
{
public int field1;
public bool field2;
public int GetHashCode() {
return field1;
}
public override bool Equals(MyClass obj2) {
return field1 == obj2.field1 &&
field2 == obj2.field2;
}
}
// last try
public class MyClass
{
public readonly int field1;
public readonly bool field2;
public int GetHashCode() {
return field1;
}
public override bool Equals(MyClass obj2) {
return field1 == obj2.field1 &&
field2 == obj2.field2;
}
}
// order by item1, then by item2
var ordered = from x in enumerable
orderby x.Item1
orderby x.Item2
select x;
// simple assignment
class Class
{
public Struct Struct { get; private set; }
}
struct Struct
{
public int field;
}
...
var obj = new Class();
obj.Struct.field = 5;
// find intersection between two users
int customerID = 12345;
var productsForFirstCustomer = from o in Orders
where o.CustomerID = customerID
select o.ProductID;
// change customer ID and compose another query...
customerID = 56789;
var productsForSecondCustomer = from o in Orders
where o.CustomerID = customerID
select o.ProductID;
if( productsForFirstCustomer.Any( productsForSecondCustomer ) )
{
...
}
// start a new worker thread after some time
void MyThreadMethod(object data) {
var start_after = 100.0 + (double)data;
}
...
var thread_number = 10;
Thread.Start(MyThreadMethod, thread_number);
// set sender's text to default
(sender as TextBox).Text = default_text;
// simple time formatting
Console.WriteLine("{0:уууу-ММ-dd}", DateTime.Today);
// using a default format string
public void Print(object obj) {
const string default_format = "<{0}>";
Print(default_format, obj);
}
public void Print(string str, params object[] objs) {
Console.WriteLine(str, objs);
}
...
Print("hello");
// read file 10 lines at a time
public IEnumerator ReadLines(string file) {
using(var sr = new StringReader(file))
while(!sr.EndOfStream)
yield return sr.ReadLine();
}
public bool Print10(IEnumerator enm) {
for(var ii = 0; ii < 10; ++ii) {
if(!enm.MoveNext())
return false;
Console.WriteLine(enm.Current);
}
return true;
}
...
var enm = ReadLines("input.txt");
while(true) {
if(!Print10(enm))
break;
if(Console.Read() != 'y' &&
Console.Read() != 'Y')
break;
}
// do something if conditions are met
if(SomethingIsTheCase() && IFeelLikeIt() && TheTimeIsRight(() => { return DateTime.Now.AddDays(10); })); {
DoSomething();
}
// parse a datestamp
var date = dt.ToString("dd/MM/yyyy");
...
var day = int.Parse(date.Split('/')[0]);
// apply rotation transform
// mygraphics is http://msdn.microsoft.com/en-us/library/system.drawing.graphics.aspx
mygraphics.RotateTransform(-Math.Atan(tan));
// modify a list
struct Point { public int x; public int y;}
List mypoints = ...;
mypoints[i].x = 10;
// write files then delete them
var files = Enumerable.Range(0, 5)
.Select(i => Path.GetTempFileName());
foreach (var file in files)
File.WriteAllText(file, "HELLO WORLD!");
/* ... many lines of codes later ... */
foreach (var file in files)
File.Delete(file);
// tracing logic
private void DumpError(Exception exception, Stack context)
{
if (context.Any())
{
Trace.WriteLine(context.Pop());
Trace.Indent();
this.DumpError(exception, context);
Trace.Unindent();
}
else
{
Trace.WriteLine(exception.Message);
}
}
// run an action after 60 seconds
private void Schedule(Action action)
{
new System.Threading.Timer(state => action, null, 60000, Timeout.Infinite);
}
// a serializable class
[Serializable]
class Hello
{
readonly object accountsLock = new object();
}
// open a file
using(var sw = new StreamWriter("resources\temp\textfile.txt")) {
...
}
DateTime.ToString("dd/mm/yyyy")
// unit test
static IEnumerable CapitalLetters(string input)
{
if (input == null)
{
throw new ArgumentNullException(input);
}
foreach (char c in input)
{
yield return char.ToUpper(c);
}
}
// spinwait for 100 ticks
long now = DateTime.Now.Ticks;
while((DateTime.Now.Ticks - now).Ticks < 100);
Retry();
// Test that null input is handled correctly
CapitalLetters(null).ExpectThrows();
// just a property
private int myVar;
public int MyVar
{
get { return MyVar; }
}
// get a path
var prefix = "C:\\MyFolder\\MySubFolder";
var suffix = "\\log\\";
var path = Path.Combine(prefix, suffix);
// vips = gold clients + some silver ones
Collection silver_clients = GetClientsVips(ClientStatus.Silver);
Collection gold_clients = GetClientsVips(ClientStatus.Silver)
Collection vips = new Collection(gold_clients);
foreach(var client in silver_clients) {
if(ClientMatchesVipRequirements(client)) {
vips.Add(client);
}
}
Sources:
- my own experience
- http://blog.roboblob.com/tag/dotnetgotcha/
- http://stackoverflow.com/questions/3703681/common-linq-standard-query-operator-mistakes-mis-steps
- http://der-waldgeist.blogspot.com/2011/04/common-linq-mistakes.html
- http://stackoverflow.com/questions/241134/what-is-the-worst-gotcha-in-c-sharp-or-net
No comments:
Post a Comment