• 31
  • 1月

Q1:为什么结构体中还用new操作符?(11章p249)
A1:貌似结构体也可以实现构造函数,用new可以执行它。(?不确定)
Q2:结构体也可以实现接口吗?(同上)
A2:貌似类能实现的东西结构体都可以实现。
恐怕是除其实例为值类型,与类实例的引用类型不同外,其他的都相同吧。也许…

10:59 2007-1-21
经过查阅MSDN的有关结构的文档,现在终于可以确定是怎么回事了。在C#中结构是可以看作一个轻量的、值类型的类,结构与类共享几乎所有相同的语法,但结构比类受到的限制更(MDSN原文)。
Q2现在很容易解释了,既然结构可以看作值类型的类,为什么不能实现接口呢?
至 于Q1,也查到了答案:所有的类型(包括int这样的值类型)都有默认的构造函数,也都可以使用new操作符调用其默认构造函数。对于值类型的变量,使用 new与不用它之间的区别是,不用new时,变量处于未赋值状态,很多时候是不可以直接使用的。而使用new操作符,则会给变量赋以默认值(可参见 MSDN的默认值表)。
21:02 2007-1-31

  • 30
  • 1月

刚刚突然想起这个问题:为什么书上的代码在连接字符串时往往是使用一个StringBuider的对象,而不是常见的string。查了一下MSDN,终于明白是怎么回事了。
以下是MSDN上的原文:
String 对象是不可改变的。每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。

StringBuider还可以通过构造函数传入或设置Capacity属性来指定它的容量。不过这里的容量并不是指它 的最大长度,实际上是存储空间的分配增量。它的意思与当初学数据结构时,“线性表的顺序表示和实现”那部分讲用数组存储线性表时定义的那个增量一致:初始 申请该属性大小的内存空间,在内容的长度在此大小内变化时就不需要进行申请或释放内存的操作,当内容长度大于该属性值时,申请一块比目前空间大 Capacity的空间,将现有数据复制进去,释放原始空间进行操作。
以上是个人理解,尚未经过验证。

  • 30
  • 1月

在WinForm应用程序中,防止在进行耗时操作时界面假死的一种解决方案–开启一个新的线程处理那些耗时的操作。于是Control类(Form的基类)提供了一个方法用于开启新的线程,这就是BeginInvoke()。
这个方法的语法看起来有些特别:
public IAsyncResult BeginInvoke (
Delegate method,
params Object[] args
)
使用前需要先定义好一个委托,使用委托来调用类自己的方法,且原始方法的参数要放在委托之后,作为BeginInvoke()的参数传进去。例如书上这段代码:
this.BeginInvoke(new UpdateWatchTextDelegate(UpdateWatchText), “Wrote change event to log”);

相关原始定义:
private delegate void UpdateWatchTextDelegate(string newText);
public void UpdateWatchText(string newText)  {…}
没有再多的研究,就先写到这里了。

  • 29
  • 1月

在练习StreamReader对象时,我建立了一个名为StreamReader的解决方案,结果问题就来了,using System.IO后,StreamReader sr=new StreamReader();一句中的StreamReader不会变蓝。与书上一模一样的main函数代码,一启动调试就报,说我把命名空间当类型来 使用。研究了半天发现书上的解决方案用的名字是StreamRead,没有er,我的StreamReader的namespace覆盖了 System.IO的StreamReader,解决方法:使用完整定位–System.IO.StreamReader。

  • 26
  • 1月

使用DateTime对象的静态属性Now,获取一个表示当前时间的实例:
DateTime dt = DateTime.Now;

如果需要像23:46 2007-1-26这样的时间格式的话,自己用以下两个方法拼一下就可以了:
dt.ToShortTimeString()
dt.ToShortDateString()
应该很容易看明白是怎么回事的。

这个可是我自己发现的哦,至少到447页了,那本《C#入门经典》都没提这件事。

  • 25
  • 1月

在实践《C#入门经典》中Windows编程部分,使用代码控制RichTextBox中SelectionFont属性时有这样的代码:
Font oldFont, newFont;
// Get the font that is being used in the selected text
oldFont = this.richTextBoxText.SelectionFont;

// If the font is using bold style now, we should remove the formatting
if (oldFont.Italic)
{
newFont = new Font(oldFont, oldFont.Style & ~FontStyle.Italic);
}
else
{
newFont = new Font(oldFont, oldFont.Style | FontStyle.Italic);
}
this.richTextBoxText.SelectionFont = newFont;
this.richTextBoxText.Focus();
用来修改选中文本的字体属性,但实际调试时发现,在某些时候选中文本(尤其是对于一些被复制进来的文本)的SelectionFont;会为null,这样传入newFont构造函数中的oldFont也为null,造成调试失败。而书上并没有提及此事。

目前我采取的方法是将oldFont赋值那句改为:
// Get the font that is being used in the selected text
oldFont = this.richTextBoxText.SelectionFont == null ? this.richTextBoxText.Font : this.richTextBoxText.SelectionFont;
在SelectionFont为空时直接采用RichTextBox的Font属性,目前看来还算解决了问题。

难道作者没有发现这个问题???

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