06 2011 档案
摘要:经常看到同事这样写代码:DataSet QueryDB(){ DataSet ds=null; try { //do something } catch (Exception ex) { //这里要做日志记录 } return ds;} 这里有几个问题:1:很明显,如果QueryDB方法发生了任何异常,客户端无法得知,例如客户端调用QueryDB方法,该方法返回了null,那这代表数据库里面没有这个数据呢?还是抛出了异常?2:注释是不应该存在的,它应该被真实的日志记录代码给替代,例如Log.Write(ex);3:该方法捕捉所有异常,这样任何异常都被捕获了,这对于开发很不方便,永远不要捕获你不
阅读全文
摘要:题目在这里:Question:关于C#连续赋值的面试题在msdn中,对=号操作符的说明如下: 赋值运算符 ( =) 将右操作数的值存储在左操作数表示的存储位置、属性或索引器中,并将值作为结果返回。操作数的类型必须相同(即右操作数必须可以隐式转换为左操作数的类型)。首先来看int x,y,z;X = y = z = 1;1:z=1,将1赋值给z,接着返回1,2:y=(z=1),将返回的1赋值给y,并返回1,3:x=(y=(z=1)),将表达式2的结果1赋值给x。接着看第一道题:const int x=1;short y;object z;z=y=x;首先要说明的是x是const,因为const是
阅读全文
摘要:我们知道C#中 a=b=c;是合法的,例如:int i,j,k;i=j=k=1;下面有两道题:1: const int x=1;short y;object z;z=y=x; //请问下面的输出是什么?Console.WriteLine(z.GetType().ToString());2: class C { private string x; public string X { get { re...
阅读全文
摘要:新建Rest服务接口: [ServiceContract]public interface IService1{ [OperationContract] string GetData(int value);}接着新建一个服务实现类:public class Service1 : IService1{ public string GetData(int value) { int i = 0; int j = 5 / i; return string.Format("You entered: {0}", value); }}在这里让Service1 抛出”divided by
阅读全文
摘要:有时候会碰到一些需要设置开始日期和结束日期的需求,比如有很多商品,每件商品都有开始出售日期和结束出售日期的字段。如何使用DatePicker控件来满足这些需求呢,下文将做解答:1:新建SL4项目文件。新建Page页面DatePickerDemo.xaml;2:新建实体类Product,包含SellBegin,SellEnd 字段。代码如下:public class Product{ public DateTime SellBegin { get; set; } public DateTime SellEnd { get; set; }}3:由于有多个Product,所以使用DataGrid显示
阅读全文
摘要:一个属性或方法可以同时被abstract 和override 修饰吗?我的一个同事这样问我。我最初的反应是:“当然不可以”,但是事实上证明的确是可以一起修饰的。 对于这个问题,我认真的思考了下,这种方式虽然少见,但是却是合法的甚至还有点意义。 假设我们有一个非常大的,复杂的类型,让我们叫他”Thingy”: abstract class Thingy{ public virtual string Name { get { return ""; } }}当然Thingy将会被很多子类集成,并且大部分子类都有一个默认的””的Name,或者是null,或者是其他什么的。关键点并
阅读全文
摘要:继上篇:Asp.net,C# 加密解密字符串,有网友提问: 也就是说加密后的数据不再是:N8lAaHMFtSAQgaf3+RUFng== 希望encryptedString是"120387789370480938409832840923492384028934…”;当然上面的数字是我随便乱敲的。那么如何实现纯数字呢??想法很简单,只要将字符变成Ascll 码就可以了。例如a:97, =:61;那么encryptedString 就可以变成 97 81 61 33 44 55 。。。;但是如果合在一起的话就变成了978161334455.问题来了:我怎么知道97是a,而不是9,7 呢?
阅读全文
摘要:首先在web.config | app.config 文件下增加如下代码: <?xml version="1.0"?> <configuration> <appSettings> <add key="IV" value="SuFjcEmp/TE="/> <add key="Key" value="KIPSToILGp6fl+3gXJvMsN4IajizYBBT"/> </appSettings> </configura
阅读全文
摘要:新建SL4 应用程序,在MainPage下添加代码: <Button x:Name="btnThread1" Click="btnThread1_Click">Thread1</Button> 后台代码为: private void btnThread1_Click(object sender, RoutedEventArgs e) { new Thread(() => { MessageBox.Show("Hello World"); }).Start(); }如果你运行程序,点击按钮,会得到下面的异
阅读全文
摘要:1:新建Silverlight4 应用程序,名称为SLStudy。建好后如下: 2:在SLStudy下新建Silverlight用户控件,Print1.xaml作为要打印的控件。 在Print1.xaml里面添加代码为: <Grid x:Name="LayoutRoot" Background="White"> <Button>这是第一个例子,简单的按钮</Button></Grid>3:已经建立好了要打印的内容了,这里打印的是一个按钮。4:修改MainPage.xaml代码如下:<Grid x:N
阅读全文
摘要:经常看到同事写代码: bool? obj=从服务器返回来的值,可能为null。 if(obj !=null && Convert.ToBoolean(obj)==true){ //Do something}上面的代码的意图很明显,先判断obj 是不是null,如果不是null 的话,再调用Convert.ToBoolean方法,判断是不是True。上面的方法没有任何问题,但有一点要确认的是, obj!=null 这句话需要判断吗?于是笔者写了下面的代码来对Convert的ToXXX方法传递null值进行测试。 可以看到,method.Invoke(null,new object
阅读全文
摘要:线程安全的一个很经常的需求是允许并发读,但是不允许并发写,例如对于文件就是这样的。ReaderWriterLockSlim 在.net framework 3.5的时候就提供了,它是用来代替以前的”fat”版本的”ReaderWriterLock”这两个类,有两种基本的锁----一个读锁,一个写锁。写锁是一个完全排他锁。读锁可以和其他的读锁兼容因此当一个线程持有写锁的是很,所有的尝试获取读锁和写锁的线程全部阻塞,但是如果没有一个线程持有写锁,那么可以有一系列的线程并发的获取读锁。ReaderWriterLockSlim 定义了下面几个方法来获取和释放 读写锁。Public void Enter
阅读全文
摘要:在上篇文章中我们使用了Wait和Pulse 实现了Countdown 接下来我们可以使用刚刚写的Countdown 类来实现两个线程的交会。 classRendezvous{staticobject_locker=newobject();staticCountdown_countdown=newCountdown(2);publicstaticvoidMainThread(){Randomr=newRandom();newThread(Mate).Start(r.Next(1000));Thread.Sleep(r.Next(10000));//主线程睡眠一段时间_countdown.Sing
阅读全文
摘要:你可能在上篇文章中深入浅出多线程系列之十二:双向信号和竞赛 注意到了这个模式:两个Waiting 循环都要下面的构造:lock(_locker){while(!_flag)Monitor.Wait(_locker);_flag=false;}在这里_flag被另一线程设置为true。这是,从作用上讲,这里在模仿AutoResetEvent。如果我们将 _flag = false;去掉,那么我们就得到了一个基本的ManualResetEvent.让我们使用Wait和Pulse来为ManualResetEvent完成剩余的代码吧。 readonlyobject_locker=newobject()
阅读全文
摘要:双向信号和竞赛(Two-Way Signaling and Races)Monitor.Pulse方法的一个重要特性是它是异步执行的,这意味着调用pulse方法并不会阻塞自己等待Monitor.Pulse返回。如果任何一个线程在pulsed 对象上等待,它是不会阻塞的,换句话说,调用Monitor.Pulse对程序不会有什么作用,你可以认为Monitor.Pulse方法被忽略了。这样Pulse提供了一个单向通信:一个 pulsing线程悄悄的向一个waiting 线程发送信号。Pulse并不会返回一个值来告诉你waiting线程是否收到信号。但是有时候我们需要知道waiting线程是否受到信号
阅读全文
摘要:上次我们使用AutoResetEvent实现了一个生产/消费者队列。这一次我们要使用Wait和Pulse方法来实现一个更强大的版本,它允许多个消费者,每一个消费者都在自己的线程中运行。我们使用数组来跟踪线程。Thread[] _workers;通过跟踪线程可以让我们在所有的线程都结束后再结束我们的队列任务。每一个消费者线程都执行一个叫做Consume的方法,在一个for循环中,我们可以创建和启动线程。例如: publicPCQueue(intworkerCount){_workers=newThread[workerCount];for(inti=0;i<workerCount;i++)
阅读全文