C#面试题2
来源:互联网 发布:网络大v评论王宝强 编辑:程序博客网 时间:2024/06/05 10:50
1:
public sealed class Singleton1
{
Singleton1()
{
Console.WriteLine("Singleton1 constructed");
}
static Singleton1()
{
Console.WriteLine("Singleton1 static constructed");
}
public static void Print()
{
Console.WriteLine("Singleton1 Print");
}
private static Singleton1 instance = new Singleton1();
public static Singleton1 Instance
{
get
{
return instance;
}
}
}
public sealed class Singleton2
{
Singleton2()
{
Console.WriteLine("Singleton2 constructed");
}
public static void Print()
{
Console.WriteLine("Singleton2 Print");
}
public static Singleton2 Instance
{
get
{
return Nested.instance;
}
}
class Nested
{
static Nested() { }
internal static readonly Singleton2 instance = new Singleton2();
}
}
public static void Main(string[] args)
{
Singleton1.Print();
Singleton2.Print();
Console.Read();
}
运行结果是:(注意构造函数,以及static参数)
Singleton1 constructed
Singleton1 static constructed
Singleton1 Print
Singleton2 Print
当我们调用Singleton1.Print时,.NET运行时会自动调用Singleton1的静态构造函数,并初始化它的静态变量。此时会创建一个Singleton1的实例,因此会调用它的构造函数。Singleton2的实例是在Nested的静态构造函数里初始化的。只有当类型Nested被使用时,才回触发.NET运行时调用它的静态构造函数。我们注意到我们只在Sington2.Instance里面用到了Nested。而在我们的代码中,只调用了Singleton2.Print。因此不会创建Singleton2的实例,也不会调用它的构造函数。
这两个类型其实都是单例模式(Singleton)的实现。第二个实现Singleton2只在真的需要时,才会创建实例,而第一个实现Singleton1则不然。第二个实现在空间效率上更好。
2:
运行下列C#代码,输出是什么?
namespace ChangesOnString
{
class Program
{
static void Main(string[] args)
{
String str = "hello";
str.ToUpper();
str.Insert(0, " WORLD");
Console.WriteLine(str);
}
}
}
答案:输出是hello。由于在.NET中,String有一个非常特殊的性质:String的实例的状态不能被改变。如果String的成员函数会修改实例的状态,将会返回一个新的String实例。改动只会出现在返回值中,而不会修改原来的实例。所以本题中输出仍然是原来的字符串值hello。
如果试图改变String的内容,改变之后的值可以通过返回值拿到。用StringBuilder是更好的选择,特别是要连续多次修改的时候。如果用String连续多次修改,每一次修改都会产生一个临时对象,开销太大。
3:
在C++和C#中,struct和class有什么不同?
答案:在C++中,如果没有标明函数或者变量是的访问权限级别,在struct中,是public的;而在class中,是private的。
在C#中,如果没有标明函数或者变量的访问权限级别,struct和class中都是private的。struct和class的区别是:struct定义值类型,其实例在栈上分配内存;class定义引用类型,其实例在堆上分配内存。
4:注意:static函数,变量,先后秩序
运行下图中的C#代码,输出是什么?
namespace StaticConstructor
{
class A
{
public A(string text)
{
Console.WriteLine(text);
}
}
class B
{
static A a1 = new A("a1");
A a2 = new A("a2");
static B()
{
a1 = new A("a3");
}
public B()
{
a2 = new A("a4");
}
}
class Program
{
static void Main(string[] args)
{
B b = new B();
}
}
}
答案:打印出四行,分别是a1、a3、a2、a4。
在调用类型B的代码之前先执行B的静态构造函数。静态函数先初始化类型的静态变量,再执行静态函数内的语句。因此先打印a1再打印a3。接下来执行B b = new B(),即调用B的普通构造函数。构造函数先初始化成员变量,在执行函数体内的语句,因此先后打印出a2、a4。
5:
Asp.net的身份验证方式有哪些,原理是什么?
=======================
ASP.NET中的身份验证方式有三种,分别如下:
1.Windows集成验证方式,其原理是利在IIS中设置的身份验证,注意必须禁止匿名访问;
2.Form表单验证方式,其原理是利用Cookie来保存用户凭证,并将未经经验证的用户指向到自定义的登录页面;
3.Passport验证方式,其原理是通过Micrsoft的集中身份验证服务执行。
6:说出你对remoting 和webservice的理解和应用
webservice是Remoting的一种实现,Remoting狭义的说是指.net应用在跨域应用程序域时互相使用对象的方式,Remoting有这么几种可能,在服务端执行,返回执行结果给客户,客户端实现一个代理;服务端返回类型信息给客户,在客户端创建一个实例;也可能是服务端创建一个实例序列化后传递给客户,在客户处反序列化后使用。类型信息可能是静态绑定或者是动态获取的。
webservice是可以internet上使用的远程对象模型,它不受到特定平台和语言的限制,如果广义的说,它也是一种Remoting的方式。
7:
根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。
public void test(int i)
{
lock(this)
{
if (i>10)
{
i--;
test(i);
}
}
}
答:不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生)
8:
.简要谈一下您对微软.NET 构架下remoting和webservice两项技术的理解以及实际中的应用。
答:WS主要是可利用HTTP,穿透防火墙。而Remoting可以利用TCP/IP,二进制传送提高效率。
remoting是.net 中用来跨越machine, process, appdomain 进行方法调用的技术,对于三成结构的程序,就可以使用remoting技术来构建.它是分布应用的基础技术.相当于以前的DCOM Web Service是一种构建应用程序的普通模型,并能在所有支持internet网通讯的操作系统上实施。Web Service令基于组件的开发和web的结合达到最佳,基于组件的对象模型
- C#面试题2
- C#面试题 C#试题 No.2
- c# 面试题汇集2
- C#面试题整理2
- C#面试题小计2
- C++/C#面试题(2)
- [转]C#面试题
- c#面试题----答案
- 通常C#面试题
- C#面试题
- C#面试题 1
- 通常C#面试题
- 通常C#面试题
- 通常C#面试题
- C#面试题
- C#面试题解答
- C#面试题解答
- C#面试题
- uva 588 Wromholes
- Linux C中令人讨厌的段错误
- 理解 JavaScript 闭包
- scp by SAS
- SQL 10 函数 3 日期时间函数 - 7 取得日期的指定部分
- C#面试题2
- 随笔
- GJB438B-2009附录K与DI-IPSC-81429的差异——GJB438B学习笔记之六
- cookies的清空和保存
- 给新考上北大软件与微电子学院的同学——利用北大资源
- .Net 中使用 ConfigurationSettings 来读取配置信息【转】
- tables in database
- 等待2
- JAVA:回调