1. 参见http://www.csdn.net/expert/topic/648/648417.xml?temp=.93479562. string在.NET里定义成了immutable的,就是一旦生成其值不可改变,Concat/Substring之类的函数都只会返回新建立的实例。对于一般程序而言,这样可以节省存储空间/提高处理效率。对于特殊应用,可以使用StringBuilder。3. string的确没有接受一个string的ctor,这是因为string不是普通的reference类型,而是primitive type, CLR由内建的指令支持。其copy和赋值是通过这些指令而不是string的函数调用完成的。4. 这个也太深入了吧?:) CLR会用一个内部结构保存类型信息,而每个类对象的实例都会有一个指向改结构的指针,这个指针是.NET对象的最小overhead(其实还有一个SyncBlockIndex,题外话)。5. C#编译器的简单翻译,比如: ArrayList oa; ... foreach(object o in oa) { ... } 等价与: IEnumerator ia = oa.GetEnumerator(); while(true) { object o = ia.Current; ... if (ia.MoveNext() == null) break; } //一维数组的处理方法略有不同。 6. You are welcome. :)
String a = new String("123");应改为String a="123";
因为返回的是新的,所以String就像int一样要用ref,明白了~楼上~,是不是普通function要用new,而virtual要用override呢?好像virtual也可以new。 new可以修改private, public的值,override不行。 class A { public void test() { } } class B : A { public void test() { } } 我不new会有warning,但是如果这样 class A { public void test(int a) { } } class B : A { public void test(double a) { } } 我不new就没有warning,有些糊涂!请指教~
qqchen79(知秋一叶) ( ) :你怎么知道这么多~,推荐两本书好么?~
new 表示隐藏。它以变量的声明为准。它不需要父类的方法使用virtual 关键字。 override 表示重写。它以变量的实例化为准。它要求父类的方法使用virtual 关键字。例如: public class a { public void m1() { Console.WriteLine("THIS IS BASE a.m1") } public virtual void m2() { Console.WriteLine("THIS IS BASE a.m2") } }public class b:a { public new void m1() { Console.WriteLine("THIS IS CHILD b.m1") } public override void m2() { Console.WriteLine("THIS IS CHILD b.m2") } }public static void Main(string[] args) { a Oa1; // 变量的声明 b Ob1; // 变量的声明 Oa1=new a(); // 变量的实例化 Oa1.m1(); // 显示:THIS IS BASE a.m1 Oa1.m2(); // 显示:THIS IS BASE a.m2 Oa1=new b(); // 变量的实例化 Oa1.m1(); // 显示:THIS IS BASE a.m1。这里是用new,所以它 // 以变量的声明为准,还是调用了父类a.m1()。 Oa1.m2(); // 显示:THIS IS CHILD b.m2。这里是用override, // 所以它以变量的实例化为准,还是调用了子类b.m2()。 Ob1=new b(); // 变量的实例化 Ob1.m1(); // 显示:THIS IS CHILD b.m1。这里是用new,所以它 // 以变量的声明为准,还是调用了子类b.m1()。 }foreach 是一种循环方式,就是在一堆东西里面对每个东西逐一进行处理。
to wuyong(WY) : 请读 http://www.csdn.net/expert/topic/648/648417.xml?temp=.9347956qqchen79(知秋一叶) 地解释好像和你得有些不一样哦~继续糊涂中,不过我觉得qqchen79(知秋一叶) 说得比较有道理~
CLR会用一个内部结构保存类型信息,而每个类对象的实例都会有一个指向改结构的指针,这个指针是.NET对象的最小overhead(其实还有一个SyncBlockIndex,题外话)。5. C#编译器的简单翻译,比如:
ArrayList oa;
...
foreach(object o in oa) {
...
}
等价与:
IEnumerator ia = oa.GetEnumerator();
while(true) {
object o = ia.Current;
...
if (ia.MoveNext() == null) break;
}
//一维数组的处理方法略有不同。 6. You are welcome. :)
new可以修改private, public的值,override不行。
class A
{
public void test()
{
}
}
class B : A
{
public void test()
{
}
}
我不new会有warning,但是如果这样
class A
{
public void test(int a)
{
}
}
class B : A
{
public void test(double a)
{
}
}
我不new就没有warning,有些糊涂!请指教~
override 表示重写。它以变量的实例化为准。它要求父类的方法使用virtual 关键字。例如:
public class a
{
public void m1()
{
Console.WriteLine("THIS IS BASE a.m1")
}
public virtual void m2()
{
Console.WriteLine("THIS IS BASE a.m2")
}
}public class b:a
{
public new void m1()
{
Console.WriteLine("THIS IS CHILD b.m1")
} public override void m2()
{
Console.WriteLine("THIS IS CHILD b.m2")
}
}public static void Main(string[] args)
{
a Oa1; // 变量的声明
b Ob1; // 变量的声明
Oa1=new a(); // 变量的实例化
Oa1.m1(); // 显示:THIS IS BASE a.m1
Oa1.m2(); // 显示:THIS IS BASE a.m2
Oa1=new b(); // 变量的实例化
Oa1.m1(); // 显示:THIS IS BASE a.m1。这里是用new,所以它
// 以变量的声明为准,还是调用了父类a.m1()。
Oa1.m2(); // 显示:THIS IS CHILD b.m2。这里是用override,
// 所以它以变量的实例化为准,还是调用了子类b.m2()。
Ob1=new b(); // 变量的实例化
Ob1.m1(); // 显示:THIS IS CHILD b.m1。这里是用new,所以它
// 以变量的声明为准,还是调用了子类b.m1()。
}foreach 是一种循环方式,就是在一堆东西里面对每个东西逐一进行处理。
请读
http://www.csdn.net/expert/topic/648/648417.xml?temp=.9347956qqchen79(知秋一叶) 地解释好像和你得有些不一样哦~继续糊涂中,不过我觉得qqchen79(知秋一叶) 说得比较有道理~
1。new 是隐藏基类的方法, override是重写基类的方法——前提是基类中必须是虚拟或抽象的
3。 String应该是个static类吧,不需要(允许)创建一个实例(即new)新手一个,不太懂,见笑
如果各位没有收到,我删贴重给~
我只知其然, qqchen79(知秋一叶) 知其所以然。
你按照他的思路去理解吧,这样对你更有益。
分已收到,谢谢!