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是參考型別,只是編譯器對其做了特殊處理。