初学C#的问题,望大家发言解惑

strom2008 2010-01-04 08:20:39
1.组件是什么?什么样的一段程序算是一个组件

2.当一个类的定义中包含另一个类时,创建外部类时,内部类是否创建?比如:
class A
{
。。。
B a;
}
A a=new A;
B的对象是否会创建,即B的构造函数是否会调用

3.virtual函数是从直接基类中继承,还是从virtual函数(同名)的最初定义的类处继承,假设已有派生类重写virtual函数了,比如:
class base
{
virtual void vf()
{}
}
class d1: base
{
override void vf()
{}
}
class d2:d1
{}
那么d2中的vf是来自base还是d1.

4.c++中,基类指针和派生类指针是可以互相转化的,派生类的可直接付给基类(隐式转换),基类的可强制类型转换赋给派生类的指针。c#中这种情况下的转化规则是什么呢?当类派生自接口类时又是怎样的呢?

5.同一类不同对象的同名事件是否可以委派不同的处理方法?即委派的处理方法是针对对象的还是针对类的

6.接收基类对象参数的地方,是否可以以派生类对象传入?

7.调用BeginXX(如accept,recevie等)将开始新的线程,这个线程是属于用户线程还是系统线程?它的启动和结束如何管理,如果socket调用了shutdown或close,由它开始的接收或发送线程是否会立即结束?

8.使用异步socket时,调用了BeginXX会开始一个新线程,比如BeginReceive,系统会在新线程中调用BeginReceive的回调函数。请问这个回调函数是在收到信息时调用,还是在BeginReceive结束后立即创建系统线程,此线程执行回调函数?
如果是前者,msdn上的系统接受线程在EndReceive上阻塞是什么意思?

希望高手予以解惑,回答部分问题也可
...全文
354 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
strom2008 2010-01-08
  • 打赏
  • 举报
回复
就留这个尾巴吧,看以后有没有人搞定,结贴了
pywepe 2010-01-08
  • 打赏
  • 举报
回复
好吧
zheng2852848 2010-01-08
  • 打赏
  • 举报
回复
通常来说,系统警告我就认为是错误了。
楼主继续那个warning 的问题已经没有多少意义了。
strom2008 2010-01-08
  • 打赏
  • 举报
回复
开来关于new virtual都加都没注意过啊
saelec 2010-01-08
  • 打赏
  • 举报
回复
UP,学习!
renstars 2010-01-08
  • 打赏
  • 举报
回复
学习一下
strom2008 2010-01-08
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 zheng2852848 的回复:]
引用 25 楼 strom2008 的回复:
引用 22 楼 yulinlover 的回复:
你用了这句:B1 d=new D(); 其结果当然是B1.vf被调用了。
这里有个隐式转换,就是把派生类D,转化成了基类B1,如果你用D d=new D();
那么d.vf就肯定不是B1的了。呵呵。

那个new的作用到底是什么呢?就是所
public new virtual void vf()
这种形式到底什么时候用呢?
用了它有什么作用呢?难到就是为了使编译器不给出警告?



new在这里起到“隔断”的作用。
例如:
D2 d2=new D2();
d2.vf();//这里的vf()即是其父类D1中的vf().new的作用是隔断了基类B1中vf()的向后继承。
[/Quote]

不明白你的解释。什么叫“隔断”呢?
B2 b2=new B2();
B2的vf定义中不加new,上面的b2。vf也会调用B2的vf的,只不过编译器会给出警告而已。
as5399271 2010-01-08
  • 打赏
  • 举报
回复
路过
zheng2852848 2010-01-08
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 strom2008 的回复:]
那就是说从中间代码级别来看new和没有new是一样的了?
就是说new只是使编译器没有警告而已,加了new表明代码是安全的,不加可能是不安全的。
个人感觉这个new应该有更多作用
[/Quote]
一般来说,如果父类和基类有相同的方法,而且父类声明virtual的话,那么子类就要声明override或者new,这两者明星是不同的,new的作用就是隐藏基类的同名方法。如果仍然声明virtual,就会出现警告,可是这个操作会有什么严重后果呢?不清楚
MournIA 2010-01-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hellowordc 的回复:]
对有些理论问题太求甚解不一定是好事!
[/Quote]
汗~~
strom2008 2010-01-08
  • 打赏
  • 举报
回复
那就是说从中间代码级别来看new和没有new是一样的了?
就是说new只是使编译器没有警告而已,加了new表明代码是安全的,不加可能是不安全的。
个人感觉这个new应该有更多作用
zheng2852848 2010-01-08
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 strom2008 的回复:]
引用 26 楼 zheng2852848 的回复:
引用 25 楼 strom2008 的回复:
引用 22 楼 yulinlover 的回复:
你用了这句:B1 d=new D(); 其结果当然是B1.vf被调用了。
这里有个隐式转换,就是把派生类D,转化成了基类B1,如果你用D d=new D();
那么d.vf就肯定不是B1的了。呵呵。

那个new的作用到底是什么呢?就是所
public new virtual void vf()
这种形式到底什么时候用呢?
用了它有什么作用呢?难到就是为了使编译器不给出警告?


new在这里起到“隔断”的作用。
例如:
D2 d2=new D2();
d2.vf();//这里的vf()即是其父类D1中的vf().new的作用是隔断了基类B1中vf()的向后继承。


不明白你的解释。什么叫“隔断”呢?
B2 b2=new B2();
B2的vf定义中不加new,上面的b2。vf也会调用B2的vf的,只不过编译器会给出警告而已。
[/Quote]

啊,这个例子举得忒不合适。看看子类不加关键字new的警告吧。
“ConsoleApplication11.D1.vf()”将隐藏继承的成员“ConsoleApplication11.B2.vf()”。若要使当前成员重写该实现,请添加关键字 override。否则,添加关键字 new。

如果子类不加关键字new,系统会自动隐藏基类的同名方法——也即自动实现了new的作用。但这种自动隐藏基类的方法肯定是不安全的,至于怎么个不安全法,我就不知道了。有没有new,得到的中间语言的代码都是相同的。这中间除了编译错误以外有什么区别,跟楼主一样期待高手。
zheng2852848 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 strom2008 的回复:]
引用 22 楼 yulinlover 的回复:
你用了这句:B1 d=new D(); 其结果当然是B1.vf被调用了。
这里有个隐式转换,就是把派生类D,转化成了基类B1,如果你用D d=new D();
那么d.vf就肯定不是B1的了。呵呵。

那个new的作用到底是什么呢?就是所
public new virtual void vf()
这种形式到底什么时候用呢?
用了它有什么作用呢?难到就是为了使编译器不给出警告?
[/Quote]


new在这里起到“隔断”的作用。
例如:
D2 d2=new D2();
d2.vf();//这里的vf()即是其父类D1中的vf().new的作用是隔断了基类B1中vf()的向后继承。
strom2008 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 yulinlover 的回复:]
你用了这句:B1 d=new D(); 其结果当然是B1.vf被调用了。
这里有个隐式转换,就是把派生类D,转化成了基类B1,如果你用D d=new D();
那么d.vf就肯定不是B1的了。呵呵。
[/Quote]
那个new的作用到底是什么呢?就是所
public new virtual void vf()
这种形式到底什么时候用呢?
用了它有什么作用呢?难到就是为了使编译器不给出警告?
xiaogug01 2010-01-07
  • 打赏
  • 举报
回复
这个问题好啊
xr13417555629 2010-01-07
  • 打赏
  • 举报
回复
up
yulinlover 2010-01-07
  • 打赏
  • 举报
回复
你用了这句:B1 d=new D(); 其结果当然是B1.vf被调用了。
这里有个隐式转换,就是把派生类D,转化成了基类B1,如果你用D d=new D();
那么d.vf就肯定不是B1的了。呵呵。
strom2008 2010-01-06
  • 打赏
  • 举报
回复
是这样的:
如果B1是顶层基类,依次派生出B2,B3派生于B2,如果B1,B2都定义virtual vf(),那么B3继承谁的呢?照书上的意思是继承自B1(顶层基类),除非B2中用new从新定义virtual vf(),有机会写个代码实验下吧,还是。
strom2008 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 yulinlover 的回复:]
引用 8 楼 strom2008 的回复:
首先感谢2楼的耐心回复。
小弟还有些疑问
2.对于这种问题是不是要在创建完A类对象时,需要用a.a=new B()来完成整个对象的创建呢,还是有更简单的方法。


你这种方法当然可以完成赋值,但是如果你在类A里直接在定义时赋值就可以了,如:
B a=new B();
这样当A类被实例化时,B对象也是被创建了。


3.如果d1中对vf的定义是virtual void vf()那么,d2中的vf来自哪个呢。我在看书时看到这样一句话:new可以用来创建新版本的virtual方法,以被后面的派生类继承,否则后面的派生类继承的是顶层基类的函数版本。这句话怎么理解呢

我对这个书上的说法表示异议,可能不同人理解不一样,我觉得用virtual定义函数,只是为了让此类的派生类可以重新实现此方法来覆盖父类此方法。所以你就算是把d1中vf改成Virtual的,那么d2由于是直接继承自d1,所以其d2中的vf还是来自d1.
但是这里你这么改,编译器可能会给出警告,说你d1里的vf方法,与基类里的vf方法同名,若要确认覆盖,可以加new 修饰符。



[/Quote]
看来我是理解错了,我试了一下确实是不加new时,编译器会给出警告,但用new来声明vf的作用仅仅是不让有警告吗?有没有其它作用呢?下面是我的测试代码:
private void button1_Click(object sender, System.EventArgs e)
{
B1 d=new D();
d.vf();
}

public class B1
{
public virtual void vf()
{
MessageBox.Show("B1中虚函数调用");
}
}
public class B2:B1
{
public vitrual void vf()
{
MessageBox.Show("B2中虚函数调用");
}
}
public class D:B2
{

}
第一个函数是我的form按钮的消息响应函数,下面的为测试的类:
B2中不加new,编译器会给出警告,但是可以运行,结果是B1的虚函数调用。当我加上new时,警告消失,但结果仍是B1虚函数调用(我觉着此处应该调用B2的虚函数啊,不解)。
当我吧d的类型声明成D的时候,结果都是B2虚函数调用,加new的结果只是消除编译器警告。

真是这样吗?谁能解释下啊。override可以实现覆盖,new的作用到底是什么呢?
hzxsasdfgh 2010-01-06
  • 打赏
  • 举报
回复
好好~好好学习天天向上~mark一下~
加载更多回复(18)

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧