看代碼,然後回答問題(難度係數65%):
enum Fruit { Apple, Pear, Orange };
請問,Fruit.Apple.GetType().ToString()將得到什麼結果?而typeof( Fruit ).GetType().ToString()呢?
這道題目的前半部分是考對枚舉類型的理解的,枚舉的每一個選項都是該枚舉類型的實例,即Fruit.Apple的類型就是Fruit,所以GetType().ToString()就是Fruit。而後半部分是考對typeof的瞭解的,這裏是一個陷阱,看起來是在取Fruit的類型,但實際上typeof( Fruit )本身的結果就是一個Type類型的對象,Type類型的對象GetType會得到Type類型的Type對象,故而答案應該是System.Type。
delegate是引用類型還是值類型?enum、int[]和string呢(難度係數40%)?
delegate引用類型,enum值類型,int[]引用類型,string引用類型。 struct也是值類型
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); //i1 = 10
AddWithRef(ref i2); //i2 = 21
Add(c.i); //c.1 =0
StringConvert(str); // str = "st";
StringConvert(c); // c.str = "string being converted.";
Console.WriteLine(i1);
Console.WriteLine(i2);
Console.WriteLine(c.i);
Console.WriteLine(str);
Console.WriteLine(c.str);
}
}
注意:ref是有進有出,out是隻出不進。經典!!!
public abstract class A
{
public A()
{
Console.WriteLine('A');
}
public virtual void Fun()
{
Console.WriteLine("A.Fun()");
}
}
public class B: A
{
public B()
{
Console.WriteLine('B');
}
public new void Fun()
{
Console.WriteLine("B.Fun()");
}
public static void Main()
{
A a = new B();
a.Fun();
}
}
A
B
A.Fun()
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
根據線程安全的相關知識,分析以下代碼,當調用test方法時i>10時是否會引起死鎖?並簡要說明理由。(10分)
public void test(int i)
{
lock(this)
{
if (i>10)
{
i--;
test(i);
}
}
}
答:不會發生死鎖,(但有一點int是按值傳遞的,所以每次改變的都只是一個副本,因此不會出現死鎖。但如果把int換做一個object,那麼死鎖會發生)