由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
DotNet版 - C#的new在method declaration里有和没有有啥区别么
相关主题
今天被一个同事给雷到了那个Control可以做这个事情?
我不知道.net里大家什么用得做多File.Copy怎么老是出错?
How to get button name? (转载)webbrowser control question
Windows, freeBSD, Mac OS X support CLIWhat is SmartClient?
screebshot: winform based weather appHow to cancel DateTimePicker event?
About memory usage of .Net program[合集] 我不知道.net里大家什么用得做多
About mono[合集] webbrowser control question
Winform Question.Please help.winform显示excel文件的问题
相关话题的讨论汇总
话题: new话题: c#话题: baseclass话题: class话题: loadimage
进入DotNet版参与讨论
1 (共1页)
b*****n
发帖数: 2324
1
除了没有new给一个warning外,跟没有是不是完全一样?
恨死这个new了,狗屁不通。人都说尽量不要定义跟基类重名的non-virtual class。
C#给你搞出个new,傻不傻啊,干嘛用啊,给人笑话的吧。
L*********r
发帖数: 92
2
如果没有这个warning,你每次定义新的method,都要查一下是不是已经在所有的基类
里定义了, 你累不累呀.
r****y
发帖数: 26819
3
哈哈,你感情丰富啊。

【在 b*****n 的大作中提到】
: 除了没有new给一个warning外,跟没有是不是完全一样?
: 恨死这个new了,狗屁不通。人都说尽量不要定义跟基类重名的non-virtual class。
: C#给你搞出个new,傻不傻啊,干嘛用啊,给人笑话的吧。

r****y
发帖数: 26819
4
他对C#的形容都是琼瑶台词的级别。

【在 L*********r 的大作中提到】
: 如果没有这个warning,你每次定义新的method,都要查一下是不是已经在所有的基类
: 里定义了, 你累不累呀.

d****d
发帖数: 133
5
C#里的New是用来解决不同Library之间versioning问题的。
比如WinForm有Button,你想做一个Image Button,于是你从Button派生了一个类。
public class ImageButton : Button
{
public virtual void LoadImage(fileName : String);
}
然后你这个自定义按钮就被大量的使用在程序里,Perfect!
然后某一天,.NET 4.0发布了,其中扩充了Button按钮,在里面加了一个方法,而这个
方法正好也叫LoadImage(没办法,微软又不知道用户会怎么扩充这些类)
public class Button
{
public virtual void LoadImage(fileName : String);
}
结果现在的问题就是你的程序没办法编译了,因为你的LoadImage掩盖了Button里的
LoadImage方法。这时你有几个选择,你可以删掉你自己的LoadImage方法,然后祈祷
微软提供的方法正好满足你的要求,你当然也可以把你自己的LoadImage

【在 b*****n 的大作中提到】
: 除了没有new给一个warning外,跟没有是不是完全一样?
: 恨死这个new了,狗屁不通。人都说尽量不要定义跟基类重名的non-virtual class。
: C#给你搞出个new,傻不傻啊,干嘛用啊,给人笑话的吧。

d****d
发帖数: 133
6
更麻烦的是,即使现在没有重名的,将来人家升级基类也有可能加进去

【在 L*********r 的大作中提到】
: 如果没有这个warning,你每次定义新的method,都要查一下是不是已经在所有的基类
: 里定义了, 你累不累呀.

L*********r
发帖数: 92
7
你说的都错.
new is only for name confliction when they have scope overlap.
in your sample, when new base class come out, the program will work as using
the old base class.
warning is not an error, you can ignore it if you like.
the loadimage defined in the imagebutton will hide the method loadimage in
base class button.

【在 d****d 的大作中提到】
: C#里的New是用来解决不同Library之间versioning问题的。
: 比如WinForm有Button,你想做一个Image Button,于是你从Button派生了一个类。
: public class ImageButton : Button
: {
: public virtual void LoadImage(fileName : String);
: }
: 然后你这个自定义按钮就被大量的使用在程序里,Perfect!
: 然后某一天,.NET 4.0发布了,其中扩充了Button按钮,在里面加了一个方法,而这个
: 方法正好也叫LoadImage(没办法,微软又不知道用户会怎么扩充这些类)
: public class Button

d****d
发帖数: 133
8
嗯,我没说清楚,我个人习惯是不会发布有warning的程序的。
所以你要非说有warning不影响程序,ignore掉那也ok。

using

【在 L*********r 的大作中提到】
: 你说的都错.
: new is only for name confliction when they have scope overlap.
: in your sample, when new base class come out, the program will work as using
: the old base class.
: warning is not an error, you can ignore it if you like.
: the loadimage defined in the imagebutton will hide the method loadimage in
: base class button.

d****d
发帖数: 133
9
嗯,你关于root of dispatch的说法是对的,不过我仍然认为加入new关键字可以
更好的标注出有可能的版本问题,维护起来比较方便。

using

【在 L*********r 的大作中提到】
: 你说的都错.
: new is only for name confliction when they have scope overlap.
: in your sample, when new base class come out, the program will work as using
: the old base class.
: warning is not an error, you can ignore it if you like.
: the loadimage defined in the imagebutton will hide the method loadimage in
: base class button.

b*****n
发帖数: 2324
10

凭什么不能编译?最多有几个warning吧
new唯一的用处就是把这几个warning藏着,是不是!

【在 d****d 的大作中提到】
: C#里的New是用来解决不同Library之间versioning问题的。
: 比如WinForm有Button,你想做一个Image Button,于是你从Button派生了一个类。
: public class ImageButton : Button
: {
: public virtual void LoadImage(fileName : String);
: }
: 然后你这个自定义按钮就被大量的使用在程序里,Perfect!
: 然后某一天,.NET 4.0发布了,其中扩充了Button按钮,在里面加了一个方法,而这个
: 方法正好也叫LoadImage(没办法,微软又不知道用户会怎么扩充这些类)
: public class Button

相关主题
About memory usage of .Net program那个Control可以做这个事情?
About monoFile.Copy怎么老是出错?
Winform Question.Please help.webbrowser control question
进入DotNet版参与讨论
b*****n
发帖数: 2324
11
你这不是搞笑嘛,new除了替你把那些warning ignore掉,还有啥用?跟你自己ignore
啥区别。

【在 d****d 的大作中提到】
: 嗯,我没说清楚,我个人习惯是不会发布有warning的程序的。
: 所以你要非说有warning不影响程序,ignore掉那也ok。
:
: using

d****d
发帖数: 133
12
区别就是mark了new以后显式的标明这个方法不再从基类中继承,使用你代码
的人(甚至你自己)就知道你这个函数和基类的函数是不同版本的。
如果直接ignore而你又只发布assembly,那用户是很难发现同名函数
是继承关系还是不同版本的。
如果你的代码不打算给被人重用,而你的记忆力又很好,你可以把你所有的
virtual方法都标注成new,这样就永远不会有warning,看你这样能维护多
复杂的项目。

ignore

【在 b*****n 的大作中提到】
: 你这不是搞笑嘛,new除了替你把那些warning ignore掉,还有啥用?跟你自己ignore
: 啥区别。

b*****n
发帖数: 2324
13
大侠,你好好看看polymorphism吧。

【在 d****d 的大作中提到】
: 区别就是mark了new以后显式的标明这个方法不再从基类中继承,使用你代码
: 的人(甚至你自己)就知道你这个函数和基类的函数是不同版本的。
: 如果直接ignore而你又只发布assembly,那用户是很难发现同名函数
: 是继承关系还是不同版本的。
: 如果你的代码不打算给被人重用,而你的记忆力又很好,你可以把你所有的
: virtual方法都标注成new,这样就永远不会有warning,看你这样能维护多
: 复杂的项目。
:
: ignore

d****d
发帖数: 133
14
或者这么说吧,如果你想在你的类你定义一个虚拟方法,但是拼错了,正好和基类
的某个虚拟方法重名,编译器没有任何警告的话会有什么结果?
然后再想想new有什么用?

【在 b*****n 的大作中提到】
: 大侠,你好好看看polymorphism吧。
c**e
发帖数: 2558
15
我觉得人家看得很明白了。

【在 b*****n 的大作中提到】
: 大侠,你好好看看polymorphism吧。
b*****n
发帖数: 2324
16
new只能把warning遮盖掉,给你些你想要的心理安慰。
btw,没看明白你下面的例子。好像是说明了没有new的好处?

【在 d****d 的大作中提到】
: 或者这么说吧,如果你想在你的类你定义一个虚拟方法,但是拼错了,正好和基类
: 的某个虚拟方法重名,编译器没有任何警告的话会有什么结果?
: 然后再想想new有什么用?

b*****n
发帖数: 2324
17
真佩服你俩的沟通。

【在 c**e 的大作中提到】
: 我觉得人家看得很明白了。
b*****n
发帖数: 2324
18
才注意到你发的这个
同意
但是这个warning是个语言就有吧
问题是为啥C#要有new呢?

【在 L*********r 的大作中提到】
: 如果没有这个warning,你每次定义新的method,都要查一下是不是已经在所有的基类
: 里定义了, 你累不累呀.

c****n
发帖数: 21367
19
因为这样可以保证无论基类怎么改,都没有ambiguity...
微软开发语言通常先是自己用的,可能几百万行的大项目里,
这个new对开发人员很有用。

基类

【在 b*****n 的大作中提到】
: 才注意到你发的这个
: 同意
: 但是这个warning是个语言就有吧
: 问题是为啥C#要有new呢?

b*****n
发帖数: 2324
20
无论基类怎么改,你都引用你开发时引用的版本不就行了,strong name不就是用来干
这个的么

【在 c****n 的大作中提到】
: 因为这样可以保证无论基类怎么改,都没有ambiguity...
: 微软开发语言通常先是自己用的,可能几百万行的大项目里,
: 这个new对开发人员很有用。
:
: 基类

相关主题
What is SmartClient?[合集] webbrowser control question
How to cancel DateTimePicker event?winform显示excel文件的问题
[合集] 我不知道.net里大家什么用得做多感觉c#真是无聊人发明的
进入DotNet版参与讨论
c****n
发帖数: 21367
21
你这么说就好比++c++对有经验的c++程序员不是问题一样
没new也只是一个warning啊
但是到大工程可能就不一样了

【在 b*****n 的大作中提到】
: 无论基类怎么改,你都引用你开发时引用的版本不就行了,strong name不就是用来干
: 这个的么

b*****n
发帖数: 2324
22
我理解,用new不用new编译出来的结果完全是一样的,是不是这么回事?

【在 c****n 的大作中提到】
: 因为这样可以保证无论基类怎么改,都没有ambiguity...
: 微软开发语言通常先是自己用的,可能几百万行的大项目里,
: 这个new对开发人员很有用。
:
: 基类

c**e
发帖数: 2558
23
你不是要看implementation么?那先去用ildasm看看编译后的IL不就知道了,呵呵

【在 b*****n 的大作中提到】
: 我理解,用new不用new编译出来的结果完全是一样的,是不是这么回事?
c**e
发帖数: 2558
24
你好好看看文档关于new的说明。人家Anders Hejlsber搞语言设计搞了n年了,
再说还有其他大牛一起搞,没用的东西不会放到C#里面的。

【在 b*****n 的大作中提到】
: 真佩服你俩的沟通。
b*****n
发帖数: 2324
25
记得Effective C++有一条讲到不要redefin non-virtual method
找出来又看了一下
Item 36: Never redefine an inherited non-virtual function
这一条说的很在理
需要用别的方法来解决的问题C#给你个new。
C#是什么习惯不好给你来什么啊。
c****n
发帖数: 21367
26
谁说effective c++的东西就是需要遵循的原则呢?
每种语言都有它自己的设计方法和原则,都有针对的开发场景,
思维模式,不能说谁高谁低的。
而且c++一直以来很为人诟病的一条就是想学术但不够严格,想通用
却不够易用。它的很多设计原则都是为了克服自身毛病的,还是
不要拿来套c#吧。
具体到这个new,thinking in c#里面讲了好几页什么情况下这个
new有用,你可以去看看有没有道理,太长了我不翻译了贴过来了。

【在 b*****n 的大作中提到】
: 记得Effective C++有一条讲到不要redefin non-virtual method
: 找出来又看了一下
: Item 36: Never redefine an inherited non-virtual function
: 这一条说的很在理
: 需要用别的方法来解决的问题C#给你个new。
: C#是什么习惯不好给你来什么啊。

b*****n
发帖数: 2324
27
你看看那个item吧,说的挺有道理,针对的是OO,不是某个语言。

【在 c****n 的大作中提到】
: 谁说effective c++的东西就是需要遵循的原则呢?
: 每种语言都有它自己的设计方法和原则,都有针对的开发场景,
: 思维模式,不能说谁高谁低的。
: 而且c++一直以来很为人诟病的一条就是想学术但不够严格,想通用
: 却不够易用。它的很多设计原则都是为了克服自身毛病的,还是
: 不要拿来套c#吧。
: 具体到这个new,thinking in c#里面讲了好几页什么情况下这个
: new有用,你可以去看看有没有道理,太长了我不翻译了贴过来了。

c****n
发帖数: 21367
28
一种设计思路下有道理的,不一定完全适用另一种啊 :)
new不new连c#自己都报warning,本来就不是hard conflict
没有明显高下的。要说怎么用,我给了引文出处,你可以去
看看有没有道理。微软它设计语言一般都自己先用,至少对于
他们而言,这个new肯定是有好处才放进去的。
对于OO,各家也都有各家的想法。不然哪来那么多形态不同的
OO语言?也不是一家说了能算的 :)

【在 b*****n 的大作中提到】
: 你看看那个item吧,说的挺有道理,针对的是OO,不是某个语言。
b*****n
发帖数: 2324
29
我理解new怎么用,能干嘛,目前我看的文献没发现new有更多的用处
就我了解的用处来看,new不影响编译结果,最多起到开发时一个提示的功能
所以,new在我眼里没啥用。

【在 c****n 的大作中提到】
: 一种设计思路下有道理的,不一定完全适用另一种啊 :)
: new不new连c#自己都报warning,本来就不是hard conflict
: 没有明显高下的。要说怎么用,我给了引文出处,你可以去
: 看看有没有道理。微软它设计语言一般都自己先用,至少对于
: 他们而言,这个new肯定是有好处才放进去的。
: 对于OO,各家也都有各家的想法。不然哪来那么多形态不同的
: OO语言?也不是一家说了能算的 :)

d****d
发帖数: 133
30
这个提示功能就已经足够了,90%或者更多的C#程序员是不需要用到new这个关键字的,
所以在你眼里看来没啥用是很正常的。

【在 b*****n 的大作中提到】
: 我理解new怎么用,能干嘛,目前我看的文献没发现new有更多的用处
: 就我了解的用处来看,new不影响编译结果,最多起到开发时一个提示的功能
: 所以,new在我眼里没啥用。

相关主题
c#之父Anders Hejlsberg 的故事我不知道.net里大家什么用得做多
[合集] c#之父Anders Hejlsberg 的故事How to get button name? (转载)
今天被一个同事给雷到了Windows, freeBSD, Mac OS X support CLI
进入DotNet版参与讨论
k****i
发帖数: 1072
31
1. For example:
public class BaseClass
{
public virtual void TraceSelf()
{
Trace.WriteLine("BaseClass");
}
}
public class SubClass:BaseClass
{
public override void TraceSelf()
{
Trace.WriteLine("SubClass");
}
}
BaseClass obj=new SubClass();
obj.TraceSelf(); //What's the output here?
public class BaseClass
{
public virtual void TraceSelf()
{
Trace.WriteLine("BaseClass");
}
}
public class SubClass:BaseClass
{
public new void TraceSelf()
{
Trace.WriteLine("SubClass");
}
}
BaseClass obj=new

【在 b*****n 的大作中提到】
: 我理解new怎么用,能干嘛,目前我看的文献没发现new有更多的用处
: 就我了解的用处来看,new不影响编译结果,最多起到开发时一个提示的功能
: 所以,new在我眼里没啥用。

j******k
发帖数: 3
32
The C# language is designed so that versioning between base and derived
classes in different libraries can evolve and maintain backwards
compatibility. This means, for example, that the introduction of a new
member in a base class with the same name as a member in a derived class is
completely supported by C# and does not lead to unexpected behavior. It also
means that a class must explicitly state whether a method is intended to
override an inherited method, or whether a method is a new method
1 (共1页)
进入DotNet版参与讨论
相关主题
winform显示excel文件的问题screebshot: winform based weather app
感觉c#真是无聊人发明的About memory usage of .Net program
c#之父Anders Hejlsberg 的故事About mono
[合集] c#之父Anders Hejlsberg 的故事Winform Question.Please help.
今天被一个同事给雷到了那个Control可以做这个事情?
我不知道.net里大家什么用得做多File.Copy怎么老是出错?
How to get button name? (转载)webbrowser control question
Windows, freeBSD, Mac OS X support CLIWhat is SmartClient?
相关话题的讨论汇总
话题: new话题: c#话题: baseclass话题: class话题: loadimage