看代码,然后回答问题(难度系数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,那么死锁会发生)