Saturday, May 14, 2005

 

Some DotNet interview questions - 1

I.
多态小quiz
From http://www.cnblogs.com/idior/archive/2005/03/04/113143.html

从codebetter上看到的,看看你的基本功

问题1
using System;

class A
{
public virtual void Foo()
{
Console.WriteLine("Call on A.Foo()");
}

}

class B : A
{
public virtual void Foo()
{
Console.WriteLine("Call on B.Foo()");
}

}

class C : B
{
public override void Foo()
{
Console.WriteLine("Call on C.Foo()");
}

}

class D
{
static void Main()
{

A c1 = new C();
c1.Foo();
Console.ReadLine();

}

}


问题2
using System;

class A
{
public virtual void Foo()
{
Console.WriteLine("Call on A.Foo()");
}

}

class B : A
{
public override void Foo()
{
Console.WriteLine("Call on B.Foo() " );
}

}

class C : B
{
public new void Foo()
{
Console.WriteLine("Call on C.Foo()");
}

}

class D
{
static void Main()
{

A c1 = new C();
c1.Foo();
Console.ReadLine();

}

}


and
问题3

using System;

class A
{
public virtual void Foo()
{
Console.WriteLine("Call on A.Foo()");
}

}

class B : A
{
public virtual new void Foo()
{
Console.WriteLine("Call on B.Foo() " );
}

}

class C : B
{
public override void Foo()
{
Console.WriteLine("Call on C.Foo()");
}

}

class D
{
static void Main()
{

A c1 = new C();
c1.Foo();
Console.ReadLine();

}

}

参考答案:

1.因为B类的Virtual与A类的方面同名。系统会自动为B类方法加上New.既B类Foo方法覆盖了A类中的方法,而C类只是Override了B类的方法.
所以第一题输入应该Call on A.Foo();

2.B类Override了A类方法。而C类中的方法又覆盖B类中的方法。
所以应该是Call on B.Foo()

3.B类覆盖了A类中的方法。而C类又Override了B类中的方法。也就是说A类中的方法FOO从来没被Override过。
所以答案应该是:Call On A.Foo()

From http://www.cnblogs.com/idior/archive/2004/12/13/76288.html

与调用普通方法不同,当CLR遇到vitual 方法的时候,会使用callvirt (IL)命令与普通的call(IL)不同callvirt除了第一句外(把this送到ecx寄存器),还有第二句,把this对象的type handle送到了eax寄存器中。另外callvirt还会先检查this对象是否为null
call
mov ecx, esi
call dword ptr ds:[352108h]

callvirt
move ecx, esi
move eax, dword ptr [ecx]
call dword ptr [eax + 38h]

然后关键的就是那个offset, 对于每个virtual方法,有以下的属性

这张图是各个关键字所对应的属性

如果是newslot,那么新方法的offset就会至少在原类型的virtual method 的最大值上+1,如果不是newslot那么就会在base类型的virtual method table中找到与该方法同名的方法。然后原类型的那个virtual method offset就会被重用。如果找不到,自然也会新建。简而言之就是有则使用原来的offset,没用就扩大virtual method table,自然使用后面的offset。这样在不同类型中同样的方法的offset是相同的,这样就保证了第三句call dword ptr [eax + 38h] ,的执行会调用到正确的方法,多态也就得到了实现。

注意从上图可以看出override的方法也是vitual method,只不过它的newslot为0,说明不需要为它寻找新的空间。

II.
From http://www.cnblogs.com/thinhunan/archive/2005/04/21/142460.html

不用编译器,回复你的答案。


感觉现在很多程序员老在追遂各种各样的新名词、新术语,别人把几个英语单词整一块,取出第一个字母,X除外,这年头,X牛啊,不在第一也优先取它,然后好像记住了这些缩写的意思,就是一个不会落伍的程序员,有些该学,理解思想是根,至于记不记得住那缩写,无关紧要吧,咱要做的是在自己的层面上有自己的新术语创立出来,让别人去记,大家说是不。举个例子吧,听棠.net就整一个什么什么(我对人名,地名,术语名这些记忆不敏感,上街要是跟人走,从不记路)出来(数据访问方面的),好东西来的,然后也出个缩写,这些东西的话,理解人家思路,拓展自家思路是本,看了人家的想法,自己在实战中就要运用人家的思想,用人家的东西还是自己再写,再扩展看实际情况。
反过来,有些基础的东西还是要记住,要清楚的,言归正传。

1.

interface IGrandFather
{
void F();
}
class Father:IGrandFather
{
public void F()
{
Console.WriteLine("\nFather.");
}
}
class Children:Father
{
public new void F()
{
Console.WriteLine("\nChildren.");
}
}
class Test
{
public static void Main(string[] args)
{
IGrandFather gf = new Children();
gf.F();
}
}




2.

interface IGrandFather
{
void F();
}
class Father:IGrandFather
{
public virtual void F()
{
Console.WriteLine("\nFather.");
}
}
class Children:Father
{
public override void F()
{
Console.WriteLine("\nChildren.");
}
}
class Test
{
public static void Main(string[] args)
{
IGrandFather gf = new Children();
gf.F();
}
}

3.

interface IGrandFather
{
void F();
}
class Father:IGrandFather
{
public virtual void F()
{
Console.WriteLine("\nFather.");
}
}
class Children:Father
{
public void F(string arg)
{
Console.WriteLine("\nChildren:{0}",arg);
}
}
class Test
{
public static void Main(string[] args)
{
IGrandFather gf = new Children();
gf.F();
}
}

4.

interface IGrandFather
{
void F();
}
abstract class Father:IGrandFather
{
public void F()
{
Console.WriteLine("\nFather.");
}
}
class Children:Father
{
public void F()
{
Console.WriteLine("\nChildren.");
}
}
class Test
{
public static void Main(string[] args)
{
IGrandFather gf = new Children();
gf.F();
}
}

5.

interface IGrandFather
{
void F();
}
abstract class Father:IGrandFather
{
public virtual void F()
{
Console.WriteLine("\nFather.");
}
}
class Children:Father
{
public void F()
{
Console.WriteLine("\nChildren:{0}");
}
}
class Test
{
public static void Main(string[] args)
{
IGrandFather gf = new Children();
gf.F();
Console.ReadLine();
}
}

6.

interface GrandFather
{
void F();
}
class Father:GrandFather
{
public void F()
{
Console.WriteLine("\nFather.");
}
}
class Children:Father,GrandFather
{
public new void F()
{
Console.WriteLine("\nChildren");
}
}
class Test
{
public static void Main(string[] args)
{
GrandFather gf = new Children();
gf.F();
Console.ReadLine();
}
}

7.readonly和const 最本质的区别在哪?


8.编写类型转换时,是别的类型转为自身用隐式转换,还是反之用隐式?


9.这段代码呢?

using System;

class A
{
public virtual void F(string p)
{
Console.WriteLine(p);
}
}
class B:A
{
public void F(ref string p)
{
Console.WriteLine("ref:"+p);
}
}
class Test
{
public static void Main(string[] args)
{
string s = "xxxx";
B b = new B();
b.F(s);
b.F(ref s);
}
}

1 Father
2 Children
3 Father
4 Father
5 Father
6 Children
7 const隐含static,readonly不隐含。const必须显式制定字面值,由默认构造器初始化,readonly可在构造器中自定义初始化。const可以用在函数内部,readonly不行。类成员身份出现的const不会被替代到源文件涉及到的地方,而是以static field的形态存在那里。enum类型的所有成员都是这种形态的变量。
8 与此无关,“扩大”型的转换用implicit,“缩小”型的转换用explicit。只有与String之间的转换规则与上述规则不同。
xxxx
ref: xxxx
(要是我面试别人,谁写这样的程序就让他走人:) Ninputer的评论)

III.
Advanced C# questions

From http://www.techinterviews.com

1. What's the advantage of using System.Text.StringBuilder over System.String?

StringBuilder is more efficient in the cases, where a lot of manipulation is done to the text. Strings are immutable, so each time it's being operated on, a new instance is created.

2. Can you store multiple data types in System.Array?

No.

3. What's the difference between the System.Array.CopyTo() and System.Array.Clone()?

The first one performs a deep copy of the array, the second one is shallow.

4. How can you sort the elements of the array in descending order?

By calling Sort() and then Reverse() methods.

5. What's the .NET datatype that allows the retrieval of data by a unique key?

HashTable.

6. What's class SortedList underneath?

A sorted HashTable.

7. Will finally block get executed if the exception had not occurred?

Yes.

8. What's the C# equivalent of C++ catch (…), which was a catch-all statement for any possible exception?

A catch block that catches the exception of type System.Exception. You can also omit the parameter data type in this case and just write catch {}.

9. Can multiple catch blocks be executed?

No, once the proper catch code fires off, the control is transferred to the finally block (if there are any), and then whatever follows the finally block.

10.Why is it a bad idea to throw your own exceptions?

Well, if at that point you know that an error has occurred, then why not write the proper code to handle that error instead of passing a new Exception object to the catch block? Throwing your own exceptions signifies some design flaws in the project.

11.What's a delegate?

A delegate object encapsulates a reference to a method. In C++ they were referred to as function pointers.

12.What's a multicast delegate?

It's a delegate that points to and eventually fires off several methods.

13.How's the DLL Hell problem solved in .NET?

Assembly versioning allows the application to specify not only the library it needs to run (which was available under Win32), but also the version of the assembly.

14.What are the ways to deploy an assembly?

An MSI installer, a CAB archive, and XCOPY command.

15.What's a satellite assembly?

When you write a multilingual or multi-cultural application in .NET, and want to distribute the core application separately from the localized modules, the localized assemblies that modify the core application are called satellite assemblies.

16.What namespaces are necessary to create a localized application?

System.Globalization, System.Resources.

17.What's the difference between / / comments, / * * / comments and / / / comments?

Single-line, multi-line and XML documentation comments.

18.How do you generate documentation from the C# file commented properly with a command-line compiler?

Compile it with a /doc switch.

19.What's the difference between < c > and < code > XML documentation tag?

Single line code example and multiple-line code example.

20.Is XML case-sensitive?

Yes, so and are different elements.

21.What debugging tools come with the .NET SDK?

CorDBG – command-line debugger, and DbgCLR – graphic debugger. Visual Studio .NET uses the DbgCLR. To use CorDbg, you must compile the original C# file using the /debug switch.

22.What does the This window show in the debugger?

It points to the object that's pointed to by this reference. Object's instance data is shown.

23.What does assert() do?

In debug compilation, assert takes in a Boolean condition as a parameter, and shows the error dialog if the condition is false. The program proceeds without any interruption if the condition is true.

24.What's the difference between the Debug class and Trace class?

Documentation looks the same. Use Debug class for debug builds, use Trace class for both debug and release builds.

25.Why are there five tracing levels in System.Diagnostics.TraceSwitcher?

The tracing dumps can be quite verbose and for some applications that are constantly running you run the risk of overloading the machine and the hard drive there. Five levels range from None to Verbose, allowing to fine-tune the tracing activities.

26.Where is the output of TextWriterTraceListener redirected?

To the Console or a text file depending on the parameter passed to the constructor.

27.How do you debug an ASP.NET Web application?

Attach the aspnet_wp.exe process to the DbgClr debugger.

28.What are three test cases you should go through in unit testing?

Positive test cases (correct data, correct output), negative test cases (broken or missing data, proper handling), exception test cases (exceptions are thrown and caught properly).

29.Can you change the value of a variable while debugging a C# application?

Yes, if you are debugging via Visual Studio.NET, you can change the value of variables by using the command window. Type IMMED in the command window prompt to switch to immediate mode which will get rid of the \">\". TO manipulate a variable in the command window, type strCustomerName.Value = \"TechInterview INC\” or txtComments.innerText = \"New String value\” and it will override the old value in strCustomerName with the new value.

30.Explain the three services model (three-tier application).

Presentation (UI), business (logic and underlying code) and data (from storage or other sources).

31.What are advantages and disadvantages of Microsoft-provided data provider classes in ADO.NET?

SQLServer.NET data provider is high-speed and robust, but requires SQL Server license purchased from Microsoft. OLE-DB.NET is universal for accessing other sources, like Oracle, DB2, Microsoft Access and Informix, but it's a .NET layer on top of OLE layer, so not the fastest thing in the world. ODBC.NET is a deprecated layer provided for backward compatibility to ODBC engines.

32.What's the role of the DataReader class in ADO.NET connections?

It returns a read-only dataset from the data source when the command is executed.

33.What is the wildcard character in SQL?Let's say you want to query database with LIKE for all employees whose name starts with La.

The wildcard character is %, the proper query with LIKE would involve 'La%'.

34.Explain ACID rule of thumb for transactions.

Transaction must be Atomic (it is one unit of work and does not dependent on previous and following transactions), Consistent (data is either committed or roll back, no “in-between” case where something has been updated and something hasn’t), Isolated (no transaction sees the intermediate results of the current transaction), Durable (the values persist if the data had been committed even if the system crashes right after).

35.What connections does Microsoft SQL Server support?

Windows Authentication (via Active Directory) and SQL Server authentication (via Microsoft SQL Server username and passwords).

36.Which one is trusted and which one is untrusted?

Windows Authentication is trusted because the username and password are checked with the Active Directory, the SQL Server authentication is untrusted, since SQL Server is the only verifier participating in the transaction.

37.Why would you use untrusted verificaion?

Web Services might use it, as well as non-Windows applications.

38.What does the parameter Initial Catalog define inside Connection String?

The database name to connect to.

39.What's the data provider name to connect to Access database?

Microsoft.Access.

40.What does Dispose method do with the connection object?

Deletes it from the memory.

41.What is a pre-requisite for connection pooling?

Multiple processes must agree that they will share the same connection, where every parameter is the same, including the security settings.



<< Home

This page is powered by Blogger. Isn't yours?