• 22
  • 3月

早就在mono里跑过自己用.net 2.0编的一个命令行的身份证号码校验程序。

mono ID.EXE 
请输入18位身份证号码:
123456789123456789
你身份证最后一位校验码应为:3
您输入的是:9
您的身份证输入校验失败!

跑得完全正常。但运行另一个用RichTextBox做的文本编辑器就提示找不到WinForm。今天在新立得里乱翻,居然看到有libmono-winforms2.0-cil一个包。.net 2.0下WinForm的mono实现?赶紧装上看看。安装完成后

mono Editor.exe

运行结果如图:

mono_winform

可以发现,菜单中文有一定的问题(猜测应该是字体问题,对话框中的中文正常)。中间的RichTextBox中无法输入中文,但粘贴进去的能正常显示。调整文字格式时有时会不正常。打开文件时只能正常显示英文部分。

尝试了一下运行官方版的飞信,报了很多错,打不开。

  • 20
  • 3月

其实这已经不能算是“.net学习日记”了,只是因为刚刚解决了在C#中没有完全搞明白的一个问题,故姑且放在这一类中吧。

这是从《Java2入门经典》这本书中抄来的:我们不能生成一个接口类型的对象,但可以生成一个接口类型的变量。这个变量就可以存储实现该接口的任何类型的对象引用。

“接口”就是接口嘛!

  • 18
  • 2月

Q:参看以下代码:
在类中定义了如下字段的方法:
private Cards hand;
public Cards PlayHand
{
get { return hand; }
}
其中Cards类继承了CollectionBase。
为什么明明PlayHand没有set,但仍可以使用PlayHand.Add()为hand增加内容呢?
14:35 2007-1-24
应该这样理解吧:PlayHand.add()实际上是get了hand,然后调用它的add()这个方法。并不是直接给hand赋了一个新值,所以不是set。

  • 14
  • 2月

书上说了,控件的Anchor属性对解决控件对窗口大小改变时的响应问题特别有用。可惜,我看了半天也没从书中看出到是怎么个“有用”法,经过自己实验,终于明白了是个怎么回事。

anchor在lingoes中的解释是:
n.  锚
vt.  抛锚停泊, 使固定

在.net的窗口中,它应该是实现了“使固定”这个意思。

在属性窗口点击Anchor右边的下三角按钮,有一个非常形象的窗口可以让你选择Top,Bottom,Left,Right四个属性值的组合。

这四个属性的作用是当你选择了表示控件一个方向的属性,如Left,那么控件的这个方向的边与窗口同方向的边的距离将会被锁定,当Left时,控件的Left边与窗口的Left边的距离将不会随窗口大小的改变而改变。

这 样锁定的结果就是,如果对称的一对边(Left和Right、Top和Bottom)中锁定了其中一个,当窗口大小改变时,控件会改变自身的位置,确保与 窗口对应边的距离不变。如果将对称的一对边都进行了锁定,当窗口大小改变时,控件对应方向的大小会随之改变,即被拉伸或压缩。

回想起当年玩VB6的时候对窗口大小变化的无奈,这个Anchor实在是个好东西!

  • 14
  • 2月

今天终于把《C#入门经典》的第Ⅰ部分“C#语言”看完了,并且成功完成最后一个完整的例子:利用那个学习过程中被不断扩展的CardLib完成了一个控制台的游戏。

通过这个游戏的代码也感受到了面向对象编程的方法。
在这个程序中每一张牌是一个Card对象,拥有最基本的ToString()方法用于表示自身的花色和牌序和实现ICloneable接口的Clone()方法。

几张牌的集合是一个Cards对象,继承了CollectionBase类,实现了对集合中Card的索引,同时也实现了ICloneable接口的Clone()方法,返回经过复制的一个Cards对象。

一 副牌Deck则包含一个Cards集合,用于存储其中所有的牌。此外还实现了更多功能:重新洗牌Shuffle()、取得其中特定序号的牌GetCard ()、实现ICloneable接口的Clone(),再有一个用于解决在GetCard()时牌已经用完的事件LastCardDrawn()

每一个游戏玩家是一个Player()类的实例,拥有自己的Name、自己手里的几张牌PlayHand和判断自己是否已经获胜的方法HasWon()。

整 个游戏是一个Game类的实例,有一副要玩的牌playDeck、被玩家扔掉暂时不能用的牌的集合discardedCards和几个玩家的集合 players,使用SetPlayer()方法加入玩家,Reshuffle()方法来处理Deck的实例playDeck的 LastCardDrawn事件,DealHands()方法进行发牌,PlayGame()进行游戏并返回胜出者的编号。

这样,在main()函数中要做的只是建立player对象,调用newGame.SetPlayers()初始化玩家,再调用newGame.PlayGame()一切就都搞定了。

整个游戏中每一个独立的部分都与一个对象对应,代码中每一个部分保持独立,互不干扰。完成每一部分功能的时候不需要过多地考虑会不会对其他部分产生影响。That’s OOP!

  • 03
  • 2月

对于一些资源,尤其是那些比较重要的系统级资源(如文件系统对象、网络系统对象、系统图形界面对象),使用后必需及时显式的释放,因为系统的垃圾回收器(GC)并不能保证在合适的时候被触发。
使用方法
1.用完后显式调用Dispose()方法
2.使用using结构,在对象超出作用域时using结构会自动调用Dispose()。
抄一段书上的代码:
using (Graphics g = this.CreateGraphics())
{
g.DrawLine(Pens.Black, new Point(0,0), new Point(3,5));
}
等价于:
Graphics g = this.CreateGraphics();
try{
g.DrawLine(Pens.Black, new Point(0,0), new Point(3,5));
}
finally{
if (g != null)
((IDisposable)g).Dispose();
}

  • 01
  • 2月

今天看了这两章,感觉明显有些发晕。毕竟不是些常用的东西。只是知道了程序集是.net组织程序,方便它们之间相互调用的一种方法。属性则是在程序中储存更多信息的一种方法。
因为感觉离自己的实际需要比较远,又从来没接触过相关的内容,一时大脑对这套东西还不能吃透。慢慢来吧。不用多久总会明白的。

  • 31
  • 1月

上课老师没讲过这个对象,用到了,自己总结一下。

使用这个对象的前提要已经存在需要进行关联的两个表,就目前情况,也就是要求DataSet对象中要存在两个有关系的表。所以之前会用到SqlConnection、SqlDataAdapter和DataSet。

建立一个DataRelation对象时方法如下:(不使用new操作符)
DataRelation myRelation=myDataSet.Relations.Add(“给它起个名字”,父表中的列,与父表对应的子表中的列)
两个列具有相同内容的行即为有关系的行。

  • 31
  • 1月

今天看到了《C#入门经典》的第24章“数据库和ADO.NET”,由于上学期听过大四的那门.net数据库编程,所以看这部门感觉是颇顺利的,要做的基本上就是逐一验证书上的代码。

不 过刚刚发现一个课上老师没提到过的类:SqlCommandBuilder,而且代码中也有使用,赶紧研究了一下,发现确实是个好东西。有了它在使用 DataAdapter时就不用自己写与SELECT语句对应的那些INSERT、UPDATE、DELETE语句了。只要在声明好一个 DataAdapter对象后,用这个DataAdapter初始化一个SqlCommandBuilder对象就OK,adapter就可以直接 Update()了。
例:
SqlConnection thisConnection = new SqlConnection(@”Data Source=riqe\sqlexpress;Initial Catalog=Northwind;Integrated Security=True”);
SqlDataAdapter thisAdapter = new SqlDataAdapter(“SELECT CustomerID,CompanyName FROM customers”, thisConnection);

SqlCommandBuilder thisBuilder = new SqlCommandBuilder(thisAdapter);

DataSet thisDataSet = new DataSet();
thisAdapter.Fill(thisDataSet, “Customers”);

thisDataSet.Tables[“Customers”].Rows[9][1] = “Acme, Inc.”;

thisAdapter.Update(thisDataSet, “Customers”);
thisConnection.Close();

如果没有定义那个SqlCommandBuilder的话,可是要自己设定DataAdapter的UpdateCommand属性,可是很麻烦的。

  • 31
  • 1月

Q1:在类中重写Equal方法,类的静态方法Equals就可以比较两个对象?
Q2:在类中实例化自己为一个字段对象有什么用处?(p265)
21:36 2007-1-21
刚才翻了一下书,重新看了一下那个程序,Q2总算是明白了。书上那个类是将自己实例化成了自身中的一个静态的Default字段,好处是可以在使用时不用每次都显式地实例化一个此类的变量,只需直接使用类的这个静态字段就可以获得一这此类的实例,在重复使用时能提高效率。
21:27 2007-1-31
又看了一下Q1也终于想明白了。首先Q1这个问题本身就有点小问题:书上代码中重写的是Equals(object obj)这个方法,不是Equal,基类中也没有Equal方法。
Equals 方法有两个重载:public virtual bool Equals(object obj)与public static bool Equals(object objA , object objB),是两个相互无关的方法,其中第二个是静态的,可以在没有实例的情况下使用。
至 于为什么会让我产生这个问题,是因为书上的代码中对两个对象同时使用了这两种方法进行比较,结果相同都为false。让我产生了误解,其实书中重写了 Equals(object obj)这个方法,比较一个对象与另一个对象的内容是否相等,而Equals(object objA , object objB)还是原始那个方法,并不会比较对象的内容,它只是简单地检查一下两个对象是否引用了相同的实例,当然两个内容都不同的对象不可能引用相同的实 例,于是也返回false。
问题解决。
21:46 2007-1-31

所有标签:.net Ajax Java javascript Linux map MySQL RSS TD-SCDMA Ubuntu vim web Win7 乱码 基础知识 备份 奥运会 希望泉 性能 缓存 编程