1.
public class A
{
public virtual void Fun1(int i)
{
Console.WriteLine(i);
}
public void Fun2(A a)
{
a.Fun1(1);
Fun1(5);
}
}
public class B : A
{
public override void Fun1(int i)
{
base.Fun1(i + 1);
}
public static void Main()
{
B b = new B();
A a = new A();
a.Fun2(b);
b.Fun2(a);
}
}
结果是:2,5,1,6
b.Fun2(a), 这里直接调的是A类里的Fun2, 第一个显示1没问题。
那么Fun1(5),会直接调A的Fun1还是调B的Fun1呢? 等价this.Fun1(5), 大家看 b.Fun2(a), 那么这个this应该指的是b. 会调b.Fun1(5),再调回A,所以是6.
2.
class Class1
{
private string str = "Class1.str";
private int i = 0;
static void StringConvert(string str)
{
str = "string being converted.";
}
static void StringConvert(Class1 c)
{
c.str = "string being converted.";
}
static void Add(int i)
{
i++;
}
static void AddWithRef(ref int i)
{
i++;
}
static void Main()
{
int i1 = 10;
int i2 = 20;
string str = "str";
Class1 c = new Class1();
Add(i1);
AddWithRef(ref i2);
Add(c.i);
StringConvert(str);
StringConvert(c);
Console.WriteLine(i1);
Console.WriteLine(i2);
Console.WriteLine(c.i);
Console.WriteLine(str);
Console.WriteLine(c.str);
}
}
这里值得注意的是Console.WriteLine(str); 这句,大家也许会想string是引用类型,str传进StringConvert而在里面修改str的值,那应该会影响出来后的值。而实际上不然,为什么呢?
因为string 对象称为不可变的(只读),因为一旦创建了该对象,就不能修改该对象的值。有的时候看来似乎修改了,实际是string经过了特殊处理,每次改变值时都会建立一个新的string对象,变量会指向这个新的对象,而原来的还是指向原来的对象,所以不会改变。这也是string效率低下的原因。
结论:
String是引用类型,只是编译器对其做了特殊处理。