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#中,structclass有什么不同

答案:C++中,如果没有标明函数或者变量是的访问权限级别,在struct中,是public的;而在class中,是private的。

                C#中,如果没有标明函数或者变量的访问权限级别,structclass中都是private的。structclass的区别是: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();

        }

    }

}

答案:打印出四行,分别是a1a3a2a4

在调用类型B的代码之前先执行B的静态构造函数。静态函数先初始化类型的静态变量,再执行静态函数内的语句。因此先打印a1再打印a3。接下来执行B b = new B(),即调用B的普通构造函数。构造函数先初始化成员变量,在执行函数体内的语句,因此先后打印出a2a4

 

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的结合达到最佳,基于组件的对象模型

原创粉丝点击